如何在Python中展平嵌套元组列表?

时间:2017-11-22 10:04:46

标签: python list-comprehension flatten

我有一个看起来像这样的元组列表:

[('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]

我想把它变成这个:

[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]

最恐怖的方式是什么?

3 个答案:

答案 0 :(得分:5)

当值中有元组时,将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')]

答案 1 :(得分:3)

单行解决方案将使用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')]

答案 2 :(得分:3)

单行,使用列表理解:

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')]

如果元素不是元组的元组,那么人为地创建一个列表,然后展平所有就完成了工作。为了避免创建单个元素列表[x](x for _ in range(1))也可以完成这项工作(虽然看起来很笨拙)

限制:不处理超过1级的嵌套。在这种情况下,必须编写更复杂/递归的解决方案。