python - 在列表理解中添加额外的项目
问题描述
我有这样的清单:
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]
解决方案
是的,通过使用生成器理解:
b = [('---', None), *((key, key.upper()) for key in a)]
除了使用生成器推导,您还可以使用列表推导。使用生成器推导的好处是它们不会创建新列表,而是一个一个地分发项目。如果您的列表 ( a
) 很大,则会影响内存使用和/或性能。
使用星号(“splat 运算符”)解包这样的序列是PEP 448 — Additional Unpacking Generalizations。它不仅允许您*
在函数调用中使用,还可以在列表、生成器和集合推导中使用(同样适用于**
和字典推导)。
推荐阅读
- python - 聚合熊猫数据框中的相同连接行(时间序列组)
- javascript - 使用 vanilla js 获取 json 字符串中键的总和
- python - ImportError:DLL 加载失败:找不到指定的过程。(thinkdsp 和 thinkplot)
- python - 使用 Python Paramiko over ssh/sftp 将文件复制到具有不同文件名的服务器
- json - 无法从来自 ElasticSearch 的 JSON 反序列化 LifeRay 服务模型对象,未找到默认构造函数
- reporting-services - SSRS 使用现有数据集计算人口和问责制
- flutter - 当使用颤振中的提供程序包在第三屏发生任何变化时,如何更改第一屏中的文本?
- javascript - 如何将 mathQuill 跨度数据导入 Svg
- javascript - 无法尝试使用 NPM 模块的别名导入组件
- javascript - 从 firestore 文档中读取特定数据并将其作为文本组件放置