2010-07-03 40 views
0

可能重复:
Flatten (an irregular) list of lists in Python压扁在Python混合列表(含iterables和noniterables)

我怎么会去压扁Python中同时包含iterables和noniterables列表,例如作为[1,[2,3,4],5,[6]]?结果应该是[1,2,3,4,5,6],列表(等等)的列表肯定不会发生。

我已经尝试过使用itertools.chain等,但他们似乎只能在清单列表上工作。帮帮我!

+0

@KennyTM,no:Q是专门关于任意嵌套的列表,而这个人想要下降不超过一个级别 - 非常不同的问题,对于这个问题递归(或递归消除)将是非常不合适的简单的迭代是好的,看我的A. – 2010-07-03 21:33:17

回答

1

所以你只想平坦化1或2个层次,而不是递归到更深层次;并且只能在列表中,而不是其他迭代,比如字符串,元组,阵列......我是否确定了你的规格?好的,如果是的话,那么...:

def flat2gen(alist): 
    for item in alist: 
    if isinstance(item, list): 
     for subitem in item: yield subitem 
    else: 
     yield item 

如果你想要一个列表结果,list(flat2gen(mylist))会产生它。

希望这对你来说很容易适应,如果你的实际规格细微差别!

+0

完美;谢谢!有时间的初步试验表明,它可能是一个触动太慢,但我看到情况很少。 – 2010-07-03 21:50:00

+0

@etotheipi,什么是典型的,有意义的“基准'alist'”为你的应用程序,你得到什么时间(以及在什么平台上)以及哪些更好?有可能以多种方式进行调整和优化,但不是在真空中,所以这些都是必需的(理想情况下在一个新的问题中,以便允许宽敞的A的答案,而不是一个挤塞的评论线程;也理想地与一些典型的“基准”alist's,不仅仅是1)。 – 2010-07-03 21:54:44

+0

不介意我说的 - 我没有改变timeit的单位,我错误地认为这个函数太慢了(doh!)。实际上,我的机器上大约需要56微秒的时间来通过比实际大小的输入(最多8-10个项目)大15倍的输入咀嚼,所以这正是我所需要的。再次感谢! – 2010-07-03 21:58:33