[英]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.