2013-04-15 206 views
22

我想知道是否有更快,更省時的方法遍歷元組列表,找到正確的匹配。我要做的就是:通過元組列表快速迭代

# this is a very long list. 
my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)] 

# go through entire list and look for match 
for j in my_list: 
    if j[0] == VALUE: 
     PAIR_FOUND = True 
     MATCHING_VALUE = j[1] 
     break 

該代碼可能需要相當長的時間來執行,根據列表中的項目數量。我確信有這樣做的更好方法。

回答

14

假設更多的內存使用量不成問題,並且如果元組的第一項可哈希,您可以在元組列表中創建一個dict,然後查找該值就像查找一個鍵一樣簡單從dict。喜歡的東西:

dct = dict(tuples) 
val = dct.get(key) # None if item not found else the corresponding value 

編輯:要創建一個反向映射,使用類似:

revDct = dict((val, key) for (key, val) in tuples) 
+0

看起來不錯,但會只允許我用'舊價值'進行搜索。是否需要創建兩個字典,以便我可以在新舊字段中搜索? – memyself

+0

@memyself:是的,你是對的。如果您需要通過*新舊值來搜索,則必須創建兩個字典。但我想這不是很糟糕,如果你想要的只是快速查找。我已經添加了用於創建反向字典的示例代碼片段。 –

+0

我不知道get(),這讓我的生活變得如此簡單。 – dgBP

25

我認爲你可以使用

for j,k in my_list: 
    [ ... stuff ... ] 
+1

但不會使循環執行得更快。會嗎? – memyself

+0

你應該看看這個其他問題:http://stackoverflow.com/questions/2191699/find-an-element-in-a-list-of-tuples – Eric

+0

發現它很容易理解,tks –

2

的代碼可以被清理,但如果您使用的是清單上存儲你的元組,任何這樣的查詢將是O(N)。

如果查找速度很重要,則應該使用dict來存儲元組。關鍵應該是你的元組的第0個元素,因爲這就是你正在尋找的東西。您可以輕鬆地從你的列表中創建一個字典:

my_dict = dict(my_list) 

然後,(VALUE, my_dict[VALUE])將會給你匹配的元組(假設VALUE存在)。

0

我不知道下面的方法是否是你想要的。可以使用defaultdict

>>> from collections import defaultdict 
>>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)] 
>>> d = defaultdict(list) 
>>> for k, v in s: 
     d[k].append(v)  
>>> sorted(d.items()) 
[('blue', [2, 4, 4]), ('red', [1, 3, 1])] 
1

的問題是死了,但還是知道的另一種方式不會傷害:

my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)] 

for first,*args in my_list: 
    if first == Value: 
     PAIR_FOUND = True 
     MATCHING_VALUE = args 
     break