2013-01-10 45 views

回答

1

一种方法是使用递归,这样的事情应该工作:

def flatten_list(l): 
    new_l = [] 
    for item in l: 
     if type(item) == type([]): 
      new_l += flatten_list(item) 
     else: 
      new_l.append(item) 
    return new_l 

我没有测试这个代码,但想法是在那里。

+0

这看起来很简单!谢谢 !只是因为它没有测试就像现在一样工作! :) –

3
def flatten(lis): 
    for i in lis: 
     if isinstance(i, collections.Iterable) and not isinstance(i, basestring): 
      for sub in flatten(i): 
       yield sub 
     else: 
      yield i 

Christian's solution摄于this question

如果你想返回一个列表,你可以使用这个:

def flatten(lis): 
    flat_list = [] 
    for i in lis: 
     if isinstance(i, collections.Iterable) and not isinstance(i, basestring): 
      flat_list.extend(flatten(i)) 
     else: 
      flat_list.append(i) 
    return flat_list 

然而,对于大名单,发电机功能是更有效的它不会计算下一个值,除非它将值存储在内存中。

+0

+1显示发电机。输入可以任意大,这将表现良好。 –

+0

在我的软件(Blender ...使用python3)...我得到这种错误,这种解决方案:“全球名称”收集“没有定义” –

+0

ops ...这是我错过了一个模块导入。但现在错误是关于“basestring”。 –