python - 从元组列表创建元组的最有效方法
问题描述
我目前正在使用带有 enumerate 的 for 循环从下面的元组列表中提取:
[(0, 'handle', 'VARCHAR(50)', 1, None, 1), (1, 'Firstname', 'TEXT', 1, None, 0), (2, 'Surname', 'TEXT', 1, None, 0), (3, 'Callname', 'TEXT', 1, None, 0), (4, 'Gender', 'INTEGER', 1, None, 0)]
我想要的是结束以下元组('handle', 'Firstname', 'Surname', 'Callname', 'Gender')
在不枚举它们并创建新元组的情况下完成此任务的最有效方法是什么,或者这是唯一的方法?
解决方案
通过枚举它们创建一个新元组:
tuple(t[1] for t in inputlist)
这使用生成器表达式将元组中的每个第二个元素传递inputlist
给tuple()
构造函数。
如果您只需要一个序列和一个列表就可以了,那么使用列表推导:
[t[1] for t in inputlist]
列表比元组更适合任意长度、有序、同质的数据集(例如您在此处的数据集),请参阅列表和元组之间的区别是什么?
如果需要原始速度并且可以不强调可读性,请使用map()
andoperator.itemgetter()
将迭代和提取移动到优化的 C 代码:
from operator import itemgetter
labels_tup = tuple(map(itemgetter(1), inputlist))
labels_list = list(map(itemgetter(1), inputlist))
但是,除非从元组列表中提取一堆字符串位于关键路径上和/或重复很多次,否则我会避免这样做。可读性很重要!
无需枚举它们并创建新元组
你无法避免这一点。您 a) 想要序列中每个元组中的一个元素,并且 b) 需要一个元组对象作为输出,一种不可变的类型。虽然您可以编写 5 个单独的语句来索引inputlist
来访问每个值,但这样做效率不高,会创建不必要的重复代码,并且会在您的输入不完全包含 5 个元素时中断。
演示:
>>> inputlist = [(0, 'handle', 'VARCHAR(50)', 1, None, 1), (1, 'Firstname', 'TEXT', 1, None, 0), (2, 'Surname', 'TEXT', 1, None, 0), (3, 'Callname', 'TEXT', 1, None, 0), (4, 'Gender', 'INTEGER', 1, None, 0)]
>>> tuple(t[1] for t in inputlist)
('handle', 'Firstname', 'Surname', 'Callname', 'Gender')
>>> [t[1] for t in inputlist]
['handle', 'Firstname', 'Surname', 'Callname', 'Gender']
推荐阅读
- clojure - 如何使用环形 Web 应用程序中的“clj-http”连接池?
- python - 将列表内的键值对添加到熊猫数据框列中
- php - 使用 DomDocument 检索文本,但删除内部 h1 标记
- javascript - aws 放大自定义标题:预期属性分配
- reactjs - 为什么酶在装饰的子组件上给出“失败的道具类型”
- python - SWIG、Python 和 unicode 字符串
- python - 在一行中的数字末尾添加文本
- javascript - Javascript:选择其他人
- php - PHP CURL HTTPS 问题
- swift - NSPopUpButton 选择浮动 Swift 4