2013-04-15 156 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