首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中展平嵌套的元组列表?

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

Stack Overflow用户
提问于 2017-11-22 18:04:46
回答 3查看 2.7K关注 0票数 4

我有一个元组列表,如下所示:

代码语言:javascript
复制
[('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]

我想把它变成这样:

代码语言:javascript
复制
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]

要做到这一点,最具Pythonic风格的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-22 18:12:44

一行,使用列表理解:

代码语言:javascript
复制
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)

收益率:

代码语言:javascript
复制
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]

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

限制:不能处理超过1层的嵌套。在这种情况下,必须编写更复杂/递归的解决方案(请查看Martijn's answer)。

票数 6
EN

Stack Overflow用户

发布于 2017-11-22 18:09:39

仅当值中有元组时,才将canonical un-flatten recipe调整为取消展平:

代码语言:javascript
复制
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

这只会解开元组,而且只有在其中有其他元组的情况下:

代码语言:javascript
复制
>>> sample = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))]
>>> list(flatten(sample))
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')]
票数 5
EN

Stack Overflow用户

发布于 2017-11-22 18:12:41

一个简单的解决方案是使用itertools.chain

代码语言:javascript
复制
>>> 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')]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47431752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档