簡體   English   中英

刪除Python中列表中的重復列表

[英]Remove duplicated lists in list of lists in Python

我在這里看到一些非常相關的問題,但他們的答案對我不起作用。 我有一個列表列表,其中一些子列表被重復,但它們的元素可能是無序的。 例如

g = [[1, 2, 3], [3, 2, 1], [1, 3, 2], [9, 0, 1], [4, 3, 2]]

根據我的問題,輸出應該是自然的:

g = [[1,2,3],[9,0,1],[4,3,2]]

我嘗試過使用set但只刪除那些相同的列表(我認為它應該可行,因為根據定義,集合沒有順序)。 我訪問過的其他問題只有列表完全重復或重復的示例如下: Python:如何刪除列表列表中的重復列表? 現在,輸出順序(列表和子列表)不是問題。

(ab)使用列表comp的副作用版本:

seen = set()

[x for x in g if frozenset(x) not in seen and not seen.add(frozenset(x))]
Out[4]: [[1, 2, 3], [9, 0, 1], [4, 3, 2]]

對於那些不喜歡以這種方式使用副作用的人(與我不同):

res = []
seen = set()

for x in g:
    x_set = frozenset(x)
    if x_set not in seen:
        res.append(x)
        seen.add(x_set)

frozenset集添加到集合中的原因是您只能將可散列對象添加到set ,並且vanilla set不可散列。

如果您不關心列表和子列表的順序(並且子列表中的所有項目都是唯一的):

result = set(map(frozenset, g))

如果子列表可能有重復項,例如[1, 2, 1, 3] frozenset(sublist) [1, 2, 1, 3]那么您可以使用tuple(sorted(sublist)) frozenset(sublist) tuple(sorted(sublist))而不是frozenset(sublist)來從子列表中刪除重復項。

如果要保留子列表的順序:

def del_dups(seq, key=frozenset):
    seen = {}
    pos = 0
    for item in seq:
        if key(item) not in seen:
            seen[key(item)] = True
            seq[pos] = item
            pos += 1
    del seq[pos:]

例:

del_dups(g, key=lambda x: tuple(sorted(x)))

請參閱在Python中,從列表中刪除重復項的最快算法是什么,以便所有元素在保留順序的同時是唯一的?

我會將列表中的每個元素轉換為凍結集(可以清除),然后創建一個集合以刪除重復項:

>>> g = [[1, 2, 3], [3, 2, 1], [1, 3, 2], [9, 0, 1], [4, 3, 2]]
>>> set(map(frozenset, g))
set([frozenset([0, 9, 1]), frozenset([1, 2, 3]), frozenset([2, 3, 4])])

如果需要將元素轉換回列表:

>>> map(list, set(map(frozenset, g)))
[[0, 9, 1], [1, 2, 3], [2, 3, 4]]

如何使用roippi frozenset這樣使用:

>>> g = [list(x) for x in set(frozenset(i) for i in [set(i) for i in g])]

[[0, 9, 1], [1, 2, 3], [2, 3, 4]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM