Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从元组列表创建元组的最有效方法_Python_List_Tuples - Fatal编程技术网

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

Python 从元组列表创建元组的最有效方法,python,list,tuples,Python,List,Tuples,我目前正在使用带有枚举的for循环从下面的元组列表中提取: [(0,'handle','VARCHAR(50)'1,None,1),(1,'Firstname','TEXT',1,None,0),(2,'names','TEXT',1,None,0),(3,'Callname','TEXT',1,None,0),(4,'Gender','INTEGER',1,None,0)] 我想要的是以下面的元组结束('handle','Firstname','names','Callname','Gende

我目前正在使用带有枚举的for循环从下面的元组列表中提取:

[(0,'handle','VARCHAR(50)'1,None,1),(1,'Firstname','TEXT',1,None,0),(2,'names','TEXT',1,None,0),(3,'Callname','TEXT',1,None,0),(4,'Gender','INTEGER',1,None,0)]

我想要的是以下面的元组结束
('handle','Firstname','names','Callname','Gender')


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

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

tuple(t[1] for t in inputlist)
这使用一个函数将第二个元素从
inputlist
中的元组传递到

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

[t[1] for t in inputlist]
列表比元组更适合任意长度、有序、同质的数据集(如这里的数据集),请参阅

如果需要原始速度且可读性可以降低,请使用和将迭代和提取移动到优化的C代码:

from operator import itemgetter

labels_tup = tuple(map(itemgetter(1), inputlist))
labels_list = list(map(itemgetter(1), inputlist))
但是,我会避免这样做,除非从元组列表中提取一组字符串是在关键路径上和/或重复很多次。可读性很重要

无需枚举它们并创建新元组

你无法避免这一点。您a)需要序列中每个元组中的一个元素,b)需要一个元组对象作为输出,一个不可变类型。虽然您可以在
inputlist
中编写5条单独的语句索引以访问每个值,但这样做效率不高,会创建不必要的重复代码,并且会在您的输入没有正好5个元素时中断

演示:


通过枚举元组来创建新元组:

tuple(t[1] for t in inputlist)
这使用一个函数将第二个元素从
inputlist
中的元组传递到

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

[t[1] for t in inputlist]
列表比元组更适合任意长度、有序、同质的数据集(如这里的数据集),请参阅

如果需要原始速度且可读性可以降低,请使用和将迭代和提取移动到优化的C代码:

from operator import itemgetter

labels_tup = tuple(map(itemgetter(1), inputlist))
labels_list = list(map(itemgetter(1), inputlist))
但是,我会避免这样做,除非从元组列表中提取一组字符串是在关键路径上和/或重复很多次。可读性很重要

无需枚举它们并创建新元组

你无法避免这一点。您a)需要序列中每个元组中的一个元素,b)需要一个元组对象作为输出,一个不可变类型。虽然您可以在
inputlist
中编写5条单独的语句索引以访问每个值,但这样做效率不高,会创建不必要的重复代码,并且会在您的输入没有正好5个元素时中断

演示:

你在找我

产出:

('handle', 'Firstname', 'Surname', 'Callname', 'Gender')
使用
for
循环的可能解决方案(不推荐):

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

我不知道为什么要避免创建元组,但不需要枚举。下面给出的示例可能会有所帮助:

def getElement(ndx):
    return inputlist[ndx][1]

# Get Second Element
print(getElement(2))
你在找我

产出:

('handle', 'Firstname', 'Surname', 'Callname', 'Gender')
使用
for
循环的可能解决方案(不推荐):

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

我不知道为什么要避免创建元组,但不需要枚举。下面给出的示例可能会有所帮助:

def getElement(ndx):
    return inputlist[ndx][1]

# Get Second Element
print(getElement(2))
这似乎是最快的原始速度(只是稍微有点-因为它保持一切在
C
尽可能多),我也很喜欢它的外观。当然,您仍然在元素之间循环

时间:

$ python3 -m timeit -s "data = [(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)]; from operator import itemgetter;" "tuple(map(itemgetter(1), data))"
500000 loops, best of 5: 477 nsec per loop
$ python3 -m timeit -s "data = [(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)]; from operator import itemgetter;" "tuple(t[1] for t in data)"
500000 loops, best of 5: 566 nsec per loop
$ python3 -m timeit -s "data = [(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)]*1000; from operator import itemgetter;" "tuple(map(itemgetter(1), data))"
2000 loops, best of 5: 146 usec per loop
$ python3 -m timeit -s "data = [(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)]*1000; from operator import itemgetter;" "tuple(t[1] for t in data)"
1000 loops, best of 5: 212 usec per loop
这似乎是最快的原始速度(只是稍微有点-因为它保持一切在
C
尽可能多),我也很喜欢它的外观。当然,您仍然在元素之间循环

时间:

$ python3 -m timeit -s "data = [(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)]; from operator import itemgetter;" "tuple(map(itemgetter(1), data))"
500000 loops, best of 5: 477 nsec per loop
$ python3 -m timeit -s "data = [(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)]; from operator import itemgetter;" "tuple(t[1] for t in data)"
500000 loops, best of 5: 566 nsec per loop
$ python3 -m timeit -s "data = [(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)]*1000; from operator import itemgetter;" "tuple(map(itemgetter(1), data))"
2000 loops, best of 5: 146 usec per loop
$ python3 -m timeit -s "data = [(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)]*1000; from operator import itemgetter;" "tuple(t[1] for t in data)"
1000 loops, best of 5: 212 usec per loop

有趣的是,我们得出了相同的结论,所以我的想法很好validated@jamylak:在这种情况下,速度更快。然而,并非所有情况下,我最多只能从itertools中挤出几个百分点(不加上这个答案,不值得麻烦)。有趣的是,我们得出了相同的结论,所以我的想法很好validated@jamylak:在这种情况下,速度更快。然而,并非在所有情况下,我最多只能从itertools中挤出几个百分点(不是这个答案,不值得费心)。