簡體   English   中英

從元組列表創建元組的最有效方法

[英]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組中的每個第二個元素inputlisttuple()構造函數

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

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM