2012-08-14 239 views
0

可能重复:
Flatten (an irregular) list of lists in Python获取列表名单列表的单一元素

我有一个像

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

我想用一组在Python列表获取所有的唯一值,但这不成功

set(l) 

TypeError: unhashable type: 'list' 

那么有人帮忙吗?想要使用列表等列表的设置THX

+3

你需要的是[扁平化列表](http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python) – StoryTeller 2012-08-14 14:12:30

+0

为什么你有不均匀的嵌套数据? – Julian 2012-08-14 14:15:10

+0

非常感谢!该代码适用于使用set! Thx – user1598203 2012-08-14 14:17:06

回答

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)) 
+0

是的,这很有用,非常感谢你! – user1598203 2012-08-14 14:18:38

1

如何对这种做法,你拼合首先列出,然后再对其应用设置操作。

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方法将具有非常大的名单更有效地工作比这list comprehension基础的方法。