繁体   English   中英

Python并删除列表列表中的重复项,无论列表中的顺序如何

[英]Python and remove duplicates in list of lists regardless of order within lists

我搜索过,并没有找到与我相同的问题。 我想从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]

同样,这是有效的,但是当我的列表很大时,它非常耗时。 有任何想法吗? 谢谢!

当你需要筑巢时, 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 ,同时跟踪到目前为止看到的frozensets:

>>> 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)一次并将结果存储在变量中。)

你可以通过这种方式进行排序

for i in range(len(A)): A[i].sort()

然后删除重复项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM