我有一个元组列表,如下所示:
[('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]
我想把它变成这样:
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]
要做到这一点,最具Pythonic风格的方法是什么?
发布于 2017-11-22 18:12:44
一行,使用列表理解:
l = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]
result = [z for y in (x if isinstance(x[0],tuple) else [x] for x in l) for z in y]
print(result)
收益率:
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]
这是人为地创建一个列表,如果元素不是元组的元组,那么展平all就可以完成这项工作。为了避免创建单个元素列表[x]
,(x for _ in range(1))
也可以完成这项工作(尽管它看起来很笨拙)
限制:不能处理超过1层的嵌套。在这种情况下,必须编写更复杂/递归的解决方案(请查看Martijn's answer)。
发布于 2017-11-22 18:09:39
仅当值中有元组时,才将canonical un-flatten recipe调整为取消展平:
def flatten(l):
for el in l:
if isinstance(el, tuple) and any(isinstance(sub, tuple) for sub in el):
for sub in flatten(el):
yield sub
else:
yield el
这只会解开元组,而且只有在其中有其他元组的情况下:
>>> sample = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]
>>> list(flatten(sample))
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]
发布于 2017-11-22 18:12:41
一个简单的解决方案是使用itertools.chain
>>> l = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]
>>> from itertools import chain
>>> [*chain.from_iterable(x if isinstance(x[0], tuple) else [x] for x in l)]
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]
https://stackoverflow.com/questions/47431752
复制相似问题