迭代每个可迭代对象,展平所有元素,然后将可迭代对象重新转换为列表。这里有两种方法:
给定
iterables = (
('1', (('2355', '5'), 'F')),
('1', (('2300', '4'), 'M')),
('1', (('2400', '5'), 'F'))
)
expected = [
['1','2355','5','F'],
['1','2300','4','M'],
['1','2400','5','F']
]
代码
从this post 修改的flatten(兼容Python 2/3):
# Approach 1
from collections import Iterable
def flatten(items):
"""Yield items from any nested iterable"""
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
for i in flatten(x):
yield i
else:
yield x
actual = [list(flatten(i)) for i in iterables]
assert actual == expected
对于单行,请考虑 more_itertools.collapse,这是一种还可以扁平化嵌套迭代的工具:
# Approach 2
import more_itertools as mit
actual = [list(mit.collapse(i)) for i in iterables]
assert actual == expected
注意:more_itertools 是一个第三方库,它实现了几个itertools recipes 和有用的工具。通过pip install more_itertools安装。