【问题标题】:Is there a way to remove duplicate list items based on nested lists independent of the order of nested list items?有没有办法根据嵌套列表删除重复的列表项,而与嵌套列表项的顺序无关?
【发布时间】:2020-02-05 07:16:57
【问题描述】:

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

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

提前谢谢你。

【问题讨论】:

    标签: python duplicates nested-lists


    【解决方案1】:

    您可以为此使用 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 这样的顺序,但它是不可变的,因此它可以进入另一个集合。

    【讨论】:

    • 这对我有用。感谢您的代码和解释。
    【解决方案2】:

    您可以使用set,或者,如果子列表可以有重复的元素,则可以使用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 Recipeunique_everseen 应该满足您的需求。如果您不关心其他列表元素中的重复项,您可以使用operator.itemgetter 作为key 函数。


    另外,你不应该使用“list”作为变量名; it's bad to shadow the builtins.

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 1970-01-01
      • 2021-12-29
      • 2018-09-15
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      相关资源
      最近更新 更多