首页 > 解决方案 > 从元组列表创建元组的最有效方法

问题描述

我目前正在使用带有 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')

在不枚举它们并创建新元组的情况下完成此任务的最有效方法是什么,或者这是唯一的方法?

标签: pythonlisttuples

解决方案


通过枚举它们创建一个新元组:

tuple(t[1] for t in inputlist)

这使用生成器表达式将元组中的每个第二个元素传递inputlisttuple()构造函数

如果您只需要一个序列和一个列表就可以了,那么使用列表推导:

[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']

推荐阅读