我想知道是否有一种更快,更省时的方法来迭代元组列表,找到正确的匹配。我所做的是:
# 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
此代码可能需要相当长的时间才能执行,具体取决于列表中的项目数。我确信有更好的方法可以做到这一点。
答案 0 :(得分:52)
我认为您可以使用
for j,k in my_list:
[ ... stuff ... ]
答案 1 :(得分:22)
假设更多的内存使用不是问题,如果你的元组的第一项是可清除的,你可以从元组列表中创建一个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)
答案 2 :(得分:3)
这个问题已经死了,但仍然知道另一种方式不会受到伤害:
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
答案 3 :(得分:2)
可以清除代码,但如果您使用列表来存储元组,那么任何此类查找都将为O(N)。
如果查找速度很重要,则应使用dict
来存储元组。键应该是元组的第0个元素,因为那是你正在搜索的内容。您可以从列表中轻松创建一个字典:
my_dict = dict(my_list)
然后,(VALUE, my_dict[VALUE])
将为您提供匹配的元组(假设存在VALUE
)。
答案 4 :(得分: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])]