从元组列表创建元组的最有效方法

Chr*_*mes 1 python tuples list

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

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

Mar*_*ers 5

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

tuple(t[1] for t in inputlist)
Run Code Online (Sandbox Code Playgroud)

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

如果你只需要一个序列而一个列表就可以了,那么使用列表理解:

[t[1] for t in inputlist]
Run Code Online (Sandbox Code Playgroud)

列表比元组更适合任意长度的、有序的、同质的数据集(例如您在此处拥有的),请参阅列表和元组之间的区别是什么?

如果需要原始速度并且可以不强调可读性,请使用map()operator.itemgetter()将迭代和提取移动到优化的 C 代码:

from operator import itemgetter

labels_tup = tuple(map(itemgetter(1), inputlist))
labels_list = list(map(itemgetter(1), inputlist))
Run Code Online (Sandbox Code Playgroud)

但是,除非从元组列表中提取一堆字符串在关键路径上和/或重复很多次,否则我会避免这样做。可读性很重要!

不枚举它们并创建一个新的元组

你无法避免这一点。您 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']
Run Code Online (Sandbox Code Playgroud)