首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python扁平化浅列表

用Python扁平化浅列表
EN

Stack Overflow用户
提问于 2009-01-02 05:40:31
回答 23查看 210.4K关注 0票数 427

有没有一种简单的方法可以用列表理解来简化可重复列表,或者如果做不到这一点,你们都会认为什么样的方法才是平衡性能和可读性这样的浅表的最佳方法呢?

我试图用嵌套的列表理解来平平这样的列表,如下所示:

代码语言:javascript
运行
复制
[image for image in menuitem for menuitem in list_of_menuitems]

但我遇到了麻烦的NameError品种,因为name 'menuitem' is not defined。在搜索并查看Stack溢出之后,我使用reduce语句获得了所需的结果:

代码语言:javascript
运行
复制
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))

但是这个方法很难读,因为我需要在那里调用list(x),因为x是Django QuerySet对象。

结论

感谢每一个为这个问题做出贡献的人。这是我学到的东西的总结。我还把它变成了一个社区wiki,以防其他人想要添加或纠正这些观察。

我最初的减少语句是多余的,最好这样写:

代码语言:javascript
运行
复制
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))

这是嵌套列表理解的正确语法(精彩摘要dF!):

代码语言:javascript
运行
复制
>>> [image for mi in list_of_menuitems for image in mi]

但是,这些方法都没有使用itertools.chain更有效。

代码语言:javascript
运行
复制
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))

正如@cdleary所指出的,通过使用chain.from_iterable来避免*操作符魔术可能更好一些,如下所示:

代码语言:javascript
运行
复制
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, 3, 5, 89, 6]
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/406121

复制
相关文章

相似问题

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