2017-07-12 57 views
2

假设我有一个元组列表[(0, 1, 2, 3), (4, 5, 6, 7), (3, 2, 1, 0)],我想删除所有元组倒置的实例,例如,从上面的列表中删除(3, 2, 1, 0)从列表中删除镜像对象的最快方法

我现在的(基本的)方法是:

L = list(itertools.permutations(np.arange(x), 4)) 

for ll in L: 
    if ll[::-1] in L: 
     L.remove(ll[::-1]) 

哪里花费时间成倍增加随着x的增加。所以如果x很大,这需要很长时间!我如何加快速度?

+1

从循环中删除列表中的东西是一个糟糕的主意。 –

+1

只是因为后者先出现而删除'(3,2,1,0)'而不是'(0,1,2,3)'? –

+0

哪个被删除并不重要 – kungphil

回答

2

使用set想到:

L = set() 
for ll in itertools.permutations(np.arange(x), 4): 
    if ll[::-1] not in L: 
     L.add(ll) 

甚至,对于表现略好:

L = set() 
for ll in itertools.permutations(np.arange(x), 4): 
    if ll not in L: 
     L.add(ll[::-1]) 
+0

,但即使'list' \ set中存在'll'的反函数,你也希望其中的一个在结果中。这就是棘手的问题。 –

+0

@ Ev.Kounis所以我**做**添加一个,如果另一个**还没有添加**。 –

+0

另外,请注意这种方法如何通过**不创建临时列表来减少内存使用。 –

0

需要保持第一看起来像它迫使你与contitional进行迭代。

a = [(0, 1, 2, 3), (4, 5, 6, 7), (3, 2, 1, 0)] 
s = set(); a1 = [] 
for t in a: 
    if t not in s: 
     a1.append(t) 
     s.add(t[::-1]) 

编辑:接受的答案解决了示例代码(即迭代工具排列样品)。这回答了任何列表(或可迭代)的一般化问题。

+0

不需要a1。如果你确实需要一个列表,'list(s)'会产生它。 –

+1

@Błotosmętek了解,但它不会保持秩序。它不会像去掉反转模糊的原始模板。 –

+0

我在OP的问题描述中没有看到维护秩序的要求...... –

相关问题