【问题标题】:Remove duplicated tuples with included lists from list从列表中删除包含列表的重复元组
【发布时间】:2014-08-13 06:44:46
【问题描述】:

我有一个包含元组的列表:

managed_list = [ ('a', [1,2]), ('a', [1,2]), ('b', [2,2]), ('b', [2,2])]

需要得到:

managed_list = [ ('a', [1,2]), ('b', [2,2]) ]

试过了:

seen = set()
[[n for n in x if n not in seen and not seen.add(n)] for x in managed_list]

得到:

TypeError: unhashable type: 'list'

【问题讨论】:

    标签: python set tuples


    【解决方案1】:

    是的,您不能在set 中使用list 或包含list(或其他不可散列类型)的结构。在不更改输入结构的情况下,您可以使用itertools.groupby,然后通过重复项丢弃迭代器:

    import itertools
    uniques = [x[0] for x in itertools.groupby(sorted(managed_list))]
    

    顺便说一句,如果不是因为不可散列的键问题(例如,如果列表是元组),您的表达式可以简化为:

    list(set(managed_list))
    

    您不需要列表推导中的额外代码。

    【讨论】:

    • 需要注意的是itertools.groupby 需要对输入进行排序才能全局工作,否则它将在连续元素上工作。
    【解决方案2】:

    您也可以使用collections.OrderedDict 删除重复键。

    >>> from collections import OrderedDict
    >>> OrderedDict([ ('a', [1,2]), ('a', [1,2]), ('b', [2,2]), ('b', [2,2])]).items()
    [ ('a', [1,2]), ('b', [2,2]) ]
    

    请记住,在重复键的情况下,最右边的条目将包含在输出中。

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 2018-05-13
      • 1970-01-01
      • 2018-12-25
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多