首页 > 解决方案 > 在列表理解中添加额外的项目

问题描述

我有这样的清单:

a = ['orange', 'apple', 'banana']

从这里我使用一个简单的列表理解构建另一个元组列表:

b = [(key, key.upper()) for key in a]

结果是这样的:

b = [('orange', 'ORANGE'), ('apple', 'APPLE'), ('banana', 'BANANA')]

b现在我需要在新生成的列表的开头(例如结尾)插入另一个元组: ('---', None).

两个简单的解决方案是:

# Solution 1
b = [('---', None)] + b

# Solution 2 
b.insert(0, ('---', None))

问题:
有没有办法直接从列表理解结构中完成同样的事情?
像这样的东西(伪代码)可以在 python 中实现吗?

b = [('---', None), (key, key.upper()) for key in a]

标签: pythonlistlist-comprehension

解决方案


是的,通过使用生成器理解:

b = [('---', None), *((key, key.upper()) for key in a)]

除了使用生成器推导,您还可以使用列表推导。使用生成器推导的好处是它们不会创建新列表,而是一个一个地分发项目。如果您的列表 ( a) 很大,则会影响内存使用和/或性能。

使用星号(“splat 运算符”)解包这样的序列是PEP 448 — Additional Unpacking Generalizations。它不仅允许您*在函数调用中使用,还可以在列表、生成器和集合推导中使用(同样适用于**和字典推导)。


推荐阅读