52

我想知道是否有一种更快、更省时的方法来遍历元组列表,找到正确的匹配项。我要做的是:

# 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

此代码可能需要相当长的时间来执行,具体取决于列表中的项目数。我确信有更好的方法来做到这一点。

4

5 回答 5

72

我认为你可以使用

for j,k in my_list:
  [ ... stuff ... ]
于 2013-04-15T17:51:23.880 回答
28

假设更多的内存使用不是问题,并且如果您的元组的第一项是可散列的,您可以从您的元组列表中创建一个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)
于 2013-04-15T17:55:02.327 回答
4

这个问题已经死了,但仍然知道另一种方式并没有什么坏处:

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
于 2017-05-12T15:05:28.963 回答
2

可以清理代码,但是如果您使用列表来存储元组,则任何此类查找都将是 O(N)。

如果查找速度很重要,您应该使用 adict来存储您的元组。键应该是元组的第 0 个元素,因为这就是您要搜索的内容。您可以轻松地从列表中创建字典:

my_dict = dict(my_list)

然后,(VALUE, my_dict[VALUE])将为您提供匹配的元组(假设VALUE存在)。

于 2013-04-15T17:54:48.263 回答
1

我想知道下面的方法是否是你想要的。

您可以使用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])]
于 2017-05-05T08:53:28.577 回答