【问题标题】:How to flatten a list of list with variable lengths into a single list? python如何将具有可变长度的列表列表展平为单个列表? Python
【发布时间】:2012-05-15 00:14:12
【问题描述】:

我刚才问过如何从这里给定定界符的字符串制作子列表(甚至更多子列表)的列表。 How to process a string into layer of sublists

现在,我需要将它们重新组合在一起,但我不知道该怎么做。我试着看这里 Python : Recursively flatten a listFlatten a list in python

但是,这些答案都不适用于我的情况,因为链将我的字符串(单个项目“列表”)拆分为字符,因此无法与“\n”连接,并且 reduce 不会连接 str 和列表对象。

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

谢谢。

【问题讨论】:

  • 请给出您的输入和所需输出的确切示例。从您之前的问题来看,您的输入是[a, a, a, [b, a, a, [b, a, c], a, [b, a, a, c], a, c], a](字母是字符串而不是变量),而您想要的输出是'aaabaabacabaacaca',对吗?
  • Flatten (an irregular) list of lists in Python 的可能副本。无论您是需要用换行符、空字符串还是现有内容连接字符串,都不会提出不同的问题。考虑两段代码,它们仅在用于计算的值上有所不同。您可以通过抽象成一个函数来统一它们,这表明它们本质上是相同的算法。问答是类似的。
  • @outis 感谢您的链接,我想我错过了。我链接的两个不适用于单个字符串项。如果可行,我将测试解决方案并删除此问题。
  • @chemelnucfin 你不能删除这个问题,因为我给出了一个赞成的答案。发布一个您无法获得其他类似问题的现有答案的问题是完全可以的。我展示了如何使用现有答案,而不是编写新代码,因此没有浪费任何精力。

标签: python list flatten sublist


【解决方案1】:

除非您另有说明,否则我将假设我在评论中所说的内容是正确的。

从您链接的帖子中,您有:

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

【讨论】:

  • 为什么不if hasattr(el, '__iter__'): ...
  • @akaRem 我不是写的,这是他链接的帖子的引用(正如我所说),但这是因为它不是那么简单——如果它支持__getitem__(0),它会起作用, __getitem__(1) 等或next(),不仅仅是它支持__iter__()。使用collections抽象基类是新版Python的规范方法。
  • 好的。我懂了。我的意思是因为str 没有__iter__listtuple 中殿,所以这个检查似乎更方便(我在这种情况下使用它)。你的评价很高。听听您的观点很有趣。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2018-02-11
  • 1970-01-01
  • 2015-03-02
  • 2022-08-21
相关资源
最近更新 更多