有没有办法根据嵌套列表删除重复的列表项,而与嵌套列表项的顺序无关?
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.itemgetter
与 key
功能相同。
此外,您不应该使用 "list" 作为变量名; it's bad to shadow the builtins.
您可以为此使用 Python 的 set
和 frozenset
:
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
一样忽略顺序,但它是不可变的,因此它可以在另一个集合中。
我正在尝试从包含嵌套列表组合和浮点值的嵌套列表中删除重复项:
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.itemgetter
与 key
功能相同。
此外,您不应该使用 "list" 作为变量名; it's bad to shadow the builtins.
您可以为此使用 Python 的 set
和 frozenset
:
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
一样忽略顺序,但它是不可变的,因此它可以在另一个集合中。