将不规则的列表展平

  • 问题:

  • 答案:
  • 使用生成器函数可以使示例更易于阅读,并可能提高性能

    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

    我用了Iterable ABC添加到2.6中

    在python3中,basestring已经不存在了,但是可以使用一个tuple:str和bytes来获得相同的效果

    yield from运算符从生成器返回一个项,一次一个。这个syntax for delegating to a subgenerator添加到3.3中

    def flatten(l):
    for el in l:
    if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
    yield from flatten(el)
    else:
    yield el