[英]Most efficient way of creating a tuple from list of tuples
我目前正在使用帶有 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
組中的每個第二個元素inputlist
給tuple()
構造函數。
如果你只需要一個序列而一個列表就可以了,那么使用列表理解:
[t[1] for t in inputlist]
列表比元組更適合任意長度的、有序的、同質的數據集(例如您在此處擁有的),請參閱列表和元組之間的區別是什么?
如果需要原始速度並且可以不強調可讀性,請使用map()
和operator.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']
您正在尋找生成器表達式。
print(tuple(i[1] for i in inputlist))
或者
t = tuple(i[1] for i in inputlist)
print(t)
輸出:
('handle', 'Firstname', 'Surname', 'Callname', 'Gender')
for
循環的可能解決方案(不推薦):
li = []
for i in inputlist:
li.append(i[1])
print(tuple(li))
在不枚舉它們並創建新元組的情況下,最有效的方法是什么,或者這是唯一的方法?
我不確定您為什么要避免創建元組,但您不需要枚舉。 可能是下面給出的例子可以幫助:
def getElement(ndx):
return inputlist[ndx][1]
# Get Second Element
print(getElement(2))
>>> from operator import itemgetter
>>> 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)]
>>> tuple(map(itemgetter(1), data))
('handle', 'Firstname', 'Surname', 'Callname', 'Gender')
這似乎是原始速度中最快的(不過只是略微 - 因為它盡可能地將所有內容保留在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.