有没有办法根据嵌套列表删除重复的列表项,而与嵌套列表项的顺序无关?

Is there a way to remove duplicate list items based on nested lists independent of the order of nested list items?

我正在尝试从包含嵌套列表组合和浮点值的嵌套列表中删除重复项:

list = [
[['Milk', 'Bread', 'Diaper'], 40.0], 
[['Milk', 'Diaper', 'Bread'], 40.0], 
[['Milk', 'Diaper', 'Beer'], 40.0], 
[['Milk', 'Beer', 'Diaper'], 40.0], 
[['Diaper', 'Bread', 'Milk'], 40.0], 
[['Diaper', 'Bread', 'Beer'], 40.0], 
[['Diaper', 'Milk', 'Bread'], 40.0], 
[['Diaper', 'Milk', 'Beer'], 40.0], 
[['Diaper', 'Beer', 'Bread'], 40.0], 
[['Diaper', 'Beer', 'Milk'], 40.0], 
[['Beer', 'Bread', 'Diaper'], 40.0], 
[['Beer', 'Milk', 'Diaper'], 40.0], 
[['Beer', 'Diaper', 'Bread'], 40.0], 
[['Beer', 'Diaper', 'Milk'], 40.0]
]

我需要能够根据删除嵌套列表的重复项从外部列表中删除项目,而不管嵌套列表中项目的顺序如何。

输出需要是每个组合的一个实例:

updated_list = [
[['Milk', 'Bread', 'Diaper'], 40.0],
[['Diaper', 'Beer', 'Bread'], 40.0], 
[['Beer', 'Diaper', 'Milk'], 40.0]
]

提前谢谢你。

您可以使用 set or, if the sublists can have duplicate elements, a collections.Counter.

集合是唯一元素的无序集合,因此 {1, 2, 3} 等同于 {3, 2, 1}。如果将列表传递给 set,它将创建一个包含列表元素的集合。但是,如果相同的值在列表中出现两次,则该信息会在集合中丢失。

# These are both the set {1, 2, 3}
s1 = {3, 1, 2, 1}
s2 = set([2, 1, 3, 3, 2])
assert s1 == s2 # True

如果列表中可能有重复项,则您需要的数据类型是多重集。不幸的是,Python 不提供多重集。但是,Counter 适用于多重集的许多用例,包括比较。

from collections import Counter
# These counters have different numbers of each value
c1 = Counter(['a', 'b', 'a', 'c'])
c2 = Counter(['c', 'b', 'b', 'a', 'c'])
assert c1 == c2 # False

至于实际删除重复项,Itertools Recipe unique_everseen should serve your needs. If you don't care about duplicates in the other list elements, you can use operator.itemgetterkey 功能相同。


此外,您不应该使用 "list" 作为变量名; it's bad to shadow the builtins.

您可以为此使用 Python 的 setfrozenset

seen_it = set()
updated_list = []
for line in list:
    key = frozenset(line[0])
    if key not in seen_it:
        seen_it.add(key)
        updated_list.append(line)

请注意 seen_it 跟踪我们之前看到的子列表以避免添加到 updated_list 中的唯一行。

另请注意,seen_it 中的键是 frozenset 类型,它会像 set 一样忽略顺序,但它是不可变的,因此它可以在另一个集合中。