首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python列表的选择性展平

Python列表的选择性展平
EN

Stack Overflow用户
提问于 2012-10-27 01:03:49
回答 3查看 212关注 0票数 2

假设我有一个列表,其中包含不同类型的子列表:

代码语言:javascript
运行
复制
[1, 2, [3, 4], {5, 6}]

我想根据元素的类型选择性地展平它(例如,我只想展平sets,其余的不展平):

代码语言:javascript
运行
复制
[1, 2, [3, 4], 5, 6]

我目前的解决方案是一个函数,但出于我对知识的好奇心,我想知道是否可以用单个列表理解来实现它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-27 01:08:38

列表理解不是为扁平化而设计的(因为它们不能组合对应于多个输入项的值)。

虽然您可以使用嵌套列表理解来解决此问题,但这要求顶级列表中的每个元素都是可迭代的。

老实说,使用一个函数就可以了。这是最干净的方法。

票数 6
EN

Stack Overflow用户

发布于 2012-10-27 01:15:37

Amber可能是对的,对于这样的事情,函数更可取。另一方面,总有一些变化的余地。我假设嵌套永远不会超过一层深度--如果它曾经超过一层深度,那么您肯定应该为此选择一个函数。但如果没有,这是一种潜在的可行方法。

代码语言:javascript
运行
复制
>>> from itertools import chain
>>> from collections import Set
>>> list(chain.from_iterable(x if isinstance(x, Set) else (x,) for x in l))
[1, 2, [3, 4], 5, 6]

这样做的非itertools方法将涉及嵌套列表理解。最好把它分成两行:

代码语言:javascript
运行
复制
>>> packaged = (x if isinstance(x, collections.Set) else (x,) for x in l)
>>> [x for y in packaged for x in y]
[1, 2, [3, 4], 5, 6]

我没有很强的直觉来判断这两个函数是否会比一个简单的函数更快或更慢。这会创建许多单例元组--这有点浪费--但它们也是以LC速度发生的,这通常是很好的。

票数 4
EN

Stack Overflow用户

发布于 2014-06-04 23:40:03

您可以使用funcy库中的flatten函数:

代码语言:javascript
运行
复制
from funcy import flatten, isa

flat_list = flatten(your_list, follow=isa(set))

你也可以浏览一下its implementation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13091284

复制
相关文章

相似问题

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