0

可能重复:
在 Python 中展平(不规则)列表列表

我在 python 中有一个列表,比如

l=[1,2,[3,4,5],[[4,2,4],[4,7,8]]]

我想使用一个集合来获取所有唯一值,但这失败了

set(l)

TypeError: unhashable type: 'list'

所以有人帮忙吗?想要使用 set 和 list of list 等 THX

4

2 回答 2

4

您需要先“展开”或展平嵌套结构,然后才能将其放入集合中。您可以为此使用生成器来保持对大型列表的效率:

def flatten(lst):
    for element in lst:
        if isinstance(element, list):
            for subelement in flatten(element):
                yield subelement
        else:
            yield element

然后使用列表中的那个生成器l来创建一个集合:

set(flatten(l))
于 2012-08-14T14:14:29.410 回答
1

这种方法怎么样,在对其应用 set 操作之前先展平列表。

import collections

def flat_list(tlist):
   if isinstance(tlist, collections.Iterable):
      return [j for i in tlist for j in flat_list(i)]
   else:
      return [tlist]

然后:

myl=[1,2,[3,4,5],[[4,2,4],[4,7,8]]]

print set(flat_list(myl))

给出:

set([1, 2, 3, 4, 5, 7, 8])

@MartijnPieters 使用生成器的方法比这种基于列表理解的方法更有效地处理非常的列表。

于 2012-08-14T14:14:55.557 回答