删除Python中列表中的重复列表

时间:2014-05-24 23:24:36

标签: python list python-2.7 set

我在这里看到的一些问题非常相关,但他们的答案并不适合我。我有一个列表列表,其中一些子列表被重复,但它们的元素可能是无序的。例如

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 : How to remove duplicate lists in a list of list?。现在,输出顺序(列表和子列表)不是问题。

4 个答案:

答案 0 :(得分:4)

(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添加可出售对象,并且香草set不可用。

答案 1 :(得分:3)

如果您不关心列表和子列表的顺序(并且子列表中的所有项目都是唯一的):

result = set(map(frozenset, g))

如果子列表可能有重复项,例如[1, 2, 1, 3],那么您可以使用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)))

请参阅In Python, what is the fastest algorithm for removing duplicates from a list so that all elements are unique while preserving order?

答案 2 :(得分:1)

我会将列表中的每个元素转换为冻结集(可以清除),然后创建一个集合以删除重复项:

>>> 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]]

答案 3 :(得分:1)

如何使用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]]