我已经搜索过,并没有像我一样找到同样的问题。我想从python中的列表列表中删除重复项;但是,我不关心列表中值的顺序。我这样做的方式目前太耗时了。
我想做什么:
A = [[1,2,3] , [2,3,4] , [3,4,5] , [3,2,4]]
我想搜索A并删除所有重复项。这里的重复是[2,3,4]和[3,2,4]。这将减少到:
smaller_A = [[1,2,3] , [2,3,4], [3,4,5]]
我目前的表现如何:
todelete = []
for i in range(len(A)):
for j in range(i+1,len(A)):
if set(A[i]) == set(A[j]):
todelete.append(j)
todelete = sorted(set(todelete))
smaller_A= [A[i] for i in range(len(A)) if i not in todelete]
同样,这很有效,但是当我的列表很大时,它非常耗时。有任何想法吗?谢谢!
答案 0 :(得分:7)
Frozensets非常适合这样的情况:
>>> A = [[1,2,3], [2,3,4], [3,4,5], [3,2,4]]
>>> smaller_A = {frozenset(x) for x in A}
>>> smaller_A
{frozenset({1, 2, 3}), frozenset({2, 3, 4}), frozenset({3, 4, 5})}
要转换回列表,您可以执行以下操作:
>>> [list(x) for x in smaller_A]
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
这不会保留您的列表或其中的元素的顺序。 (虽然这里没有什么区别。)
如果您确实需要保留订单,则可以在跟踪到目前为止看到的冻结的同时迭代A
:
>>> A = [[1,2,3], [2,3,4], [3,4,5], [3,2,4]]
>>> seen = set()
>>> smaller_A = []
>>> for x in A:
... if frozenset(x) not in seen:
... smaller_A.append(x)
... seen.add(frozenset(x))
...
>>> smaller_A
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
(这不是优化的;理想情况下,您只需调用frozenset(x)
一次并将结果存储在变量中。)
答案 1 :(得分:1)
你可以通过这种方式排序
for i in range(len(A)): A[i].sort()
然后删除重复项