簡體   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