【问题标题】:Python. Remove duplicate elements from a list of listPython。从列表列表中删除重复元素
【发布时间】:2016-04-08 03:38:31
【问题描述】:

我有一个包含三个级别的列表,其中包含不同数量的元素,比如这个:

>>> print some_list
[ [a], [[b,c],[b,c]], [[b,c],[b,c]], [d], [[e,f],[e,g]], [h,j,k,l,m] ]

如何从中删除重复的元素? 另外,我想要一个包含一个级别和所有唯一元素的输出列表。 我试过 set() 函数,但它返回错误输出。

【问题讨论】:

  • 您的预期输出是什么?什么错误?您尝试的确切代码是什么?
  • 重复的定义是什么?在最高级别?
  • 也许,一个很好的起点是研究为什么 list 不能成为 set 的成员:list 在 Python 中是不可散列的。
  • 请更新您的问题以阐明您要删除元素的级别,以便人们可以对您的问题进行投票。
  • 感谢大家的回答,我证明了一切并且工作得很好。谢谢

标签: python


【解决方案1】:

如果您只想要所有非重复元素的(单一平面)列表,您可以这样做。虽然我确定这是重复的。

import itertools
print(list(set(itertools.chain(*itertools.chain.from_iterable(some_list)))))

结果:

>>> some_list = [ ['a'], [['b','c'],['b','c']], [['b','c'],['b','c']], ['d'], [['e','f'],['e','g']], ['h','j','k','l','m'] ]

>>> print(list(set(itertools.chain(*itertools.chain.from_iterable(some_list))))

['f', 'm', 'k', 'b', 'd', 'j', 'a', 'c', 'e', 'g', 'h', 'l']

【讨论】:

  • 是的,这似乎在 OP 想要的级别上不起作用,即删除 [[b,c],[b,c]] 一次。
  • 你是对的,这将是一个无法使用的类型错误,忘记还有进一步的嵌套。我更新更正
【解决方案2】:

post 中使用了来自 HYRY 的实用程序函数。

一旦你从列表转换为元组,你的设定想法实际上是有效的:

def list2tuple(a):
    return tuple((list2tuple(x) if isinstance(x, list) else x for x in a))
def tuple2list(a):
    return list((tuple2list(x) if isinstance(x, tuple) else x for x in a))

l1=[ ['a'], [['b','c'],['b','c']], [['b','c'],['b','c']], ['d'], [['e','f'],['e','g']], ['h','j','k','l','m'] ]
#tuples are hashable, but lists aren't, so you have to convert to a tuple first
print  tuple2list(set(list2tuple(l1)))

输出:

[['d'], ['a'], ['h', 'j', 'k', 'l', 'm'], [['e', 'f'], ['e', 'g']], [['b', 'c'], ['b', 'c']]]

【讨论】:

    【解决方案3】:

    首先展平你的列表,然后使用 set():

    your_list = [['a'], [['b', 'c'],['b', 'c']], [['b', 'c'], ['b', 'c']], ['d'], [['e', 'f'],['e', 'g']], ['h', 'j', 'k', 'l', 'm']]
    
    def flatten(items):
        for item in items:
           if isinstance(item, list):
               yield from flatten(item)  # Python 3.3
           else:
               yield item
    
    print(sorted(set(flatten(your_list))))
    

    输出:['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      相关资源
      最近更新 更多