【问题标题】:Eliminate duplicate from list of lists [duplicate]从列表列表中消除重复项[重复]
【发布时间】:2020-05-20 10:05:43
【问题描述】:

我需要从这样的列表中删除重复项:

    list = [[10, 5, 3], [10, 5, 3], [10, 10, 3], [10, 10], [3, 3, 3], [10, 5, 3]]

预期结果:

    result_list = [[10, 5, 3], [10, 3], [10], [3]]

消除子列表和主列表中的重复项,这可能吗? 我试过了:

    result_list = [list(result) for result in set(set(item) for item in list)]

但是抛出一个 TypeError 说一个集合是一个不可散列的类型

我认为这不是一个重复的问题,我需要删除子列表中的重复项,而不仅仅是主列表中的。 感谢所有帮助过我的人,问题解决了。

【问题讨论】:

标签: python list duplicates set


【解决方案1】:

您应该使用map 以转换为tuple

result = [list(set(i)) for i in set(map(tuple, mylist))]

输出

[[3], [10, 3, 5], [10, 3], [10]]

【讨论】:

  • 谢谢,非常优雅的解决方案。
  • @delete,那么您可以接受答案以帮助其他人
  • 对不起,我不知道该怎么做,现在完成。
【解决方案2】:

集合不可散列,但冻结集是:

lst = [[10, 5, 3], [10, 5, 3], [10, 10, 3], [10, 10], [3, 3, 3], [10, 5, 3]]
result_list = [list(result) for result in set(frozenset(item) for item in lst)]

也不要隐藏内置名称list,特别是如果您想在之后立即使用其通常含义。

【讨论】:

    【解决方案3】:

    您需要使用tuples 才能使用set,但是在嵌套列表推导中,您可以将此元组项转回列表:

    list_example = [[10, 5, 3], [10, 5, 3], [10, 10, 3], [10, 10], [3, 3, 3], [10, 5, 3]]
    output = [list(x) for x in (list(set([tuple(set(result)) for result in list(set(item) for item in list_example)])))]
    print(output)
    

    输出:

    [[10, 3, 5], [10], [10, 3], [3]]
    

    【讨论】:

      【解决方案4】:

      你正在迭代一个列表:

      for item in list

      将结果放入一个集合中:

      set(item)

      然后将集合放入集合中:

      set(set(item)

      对于任何要进入set 的东西,它必须是可散列的,这意味着它具有定义的散列值,该散列值是由不可变对象产生的。 sets 不是不可变的,因此没有散列。见Why aren't Python sets hashable?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 2011-01-13
        • 2014-04-20
        相关资源
        最近更新 更多