# 扁平化处理嵌套型的序列

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, ignore_types):
            yield from flatten(x)
        else:
            yield x 
items = [1, 2, [3, 4, [5, 6], 7], 8]
for x in flatten(items):
    print(x, end=\'\')  # 12345678

items = [\'Dave\', \'Paula\', [\'Thomas\', \'Lewis\']]
for x in flatten(items):
    print(x, \',\', end=\'\')  # Dave ,Paula ,Thomas ,Lewis ,

代码中的参数ignore_types和对not isinstance(x, ignore_types)的检查是为了避免将字符串和字节串解释为可迭代对象,进而将它们展开为单独的一个个字符。如果还有其他类型不想展开的,可以为ignore_types参数提供不同的值来确定。

yield from 是一个快捷方式,相当于返回了另一个生成器,等同于下面这种写法:

def flatten(items, ignore_types=(str, bytes)):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, ignore_types):
            for i in flatten(x):
                yield i
        else:
            yield x 

收藏 打印