2012-05-15 49 views
-1

我刚才问过如何在这里给出一个字符串给定分隔符的子列表(甚至更多的子列表)。 How to process a string into layer of sublists如何将可变长度的列表平铺到单个列表中? python

现在,我需要加入他们回来,我不知道如何。我试图在这里寻找 Python : Recursively flatten a listFlatten a list in python

然而,在我的情况没有这些答案的工作,因为链分割我的字符串(单个项目“名单”)成字符,然后因此不能为“\ n加入“,并且reduce不会连接str和list对象。

我可能需要在某个点上通过子列表(及其子列表)。有没有办法遍历每个级别的子列表? (我可以把它作为一个单独的问题,一次一步......但只是想知道这个过程是否有意义,或者我应该尝试一种全新的方法,我认为逻辑上这是最有意义的,我只是有麻烦导航它。)

谢谢。

+2

请给出您的输入和所需输出的确切示例。从你以前的问题看,你的输入看起来像是[a,a,a,[b,a,a,[b,a,c],a,[b,a,a,c],a,c], a]'(字母不是变量),你想要的输出是'aaabaabacabaacaca',是吗? – agf

+0

[Flatten(不规则)列表在Python中]的可能重复(http://stackoverflow.com/q/2158395/)。无论你是否需要用换行符连接字符串,空字符串还是什么 - 你都不会针对不同的问题。考虑两个仅用于计算的值不同的代码。你可以通过抽象成一个函数来统一它们,这表明它们本质上是相同的算法。问与答是类似的。 – outis

+0

@agf是的,这是正确的。 – chemelnucfin

回答

3

我打算假设我在评论中所说的话是正确的,除非您另有说明。

从你链接的帖子,您有:

import collections 

def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, basestring): 
      for sub in flatten(el): 
       yield sub 
     else: 
      yield el 

recursively flatten an irregular list of lists,并

def go(it): 
    for x in it: 
     if x == 'b': 
      yield [x] + list(go(it)) 
     else: 
      yield x 
      if x == 'c': 
       break 

create that irregular list of lists from an iterator

go逆只是flatten(output_of_go)所以go(iter(string))的倒数是''.join(flatten(output_of_go))。您可以看到,使用此测试代码:

lst = "aaabaabacabaacaca" 
assert ''.join(flatten(go(iter(lst)))) == lst 
+0

为什么不''如果hasattr(el,'__iter__'):...'? – akaRem

+0

@akaRem我没有写它,这是他链接的帖子引用(正如我声明的),但这是因为它不是那么简单 - 如果它支持'__getitem __(0)','__getitem __(1 )'或者'next()',而不仅仅是它支持'__iter __()'。使用'collections'抽象基类是新版Python的规范方法。 – agf

+0

好的。我懂了。我的意思是因为'str'没有'__iter__',而是'list'和'tuple' nave,这个检查似乎更加方便(我在这种情况下使用它)。你有很好的评价。听到你的观点很有趣。 – akaRem