Python 在键/值对列表中查找值

Python 在键/值对列表中查找值,python,list,Python,List,我有两张单子 old_name_list = [a-1234, a-1235, a-1236] new_name_list = [(a-1235, a-5321), (a-1236, a-6321), (a-1234, a-4321), ... ] 我想递归搜索旧名称列表中的元素是否存在于新名称列表中,并返回与其关联的值,例如,旧名称列表中的第一个元素返回a-4321,第二个元素返回a-5321,依此类推,直到旧名称列表完成 我试过以下方法,但不起作用 for old_name, new_na

我有两张单子

old_name_list = [a-1234, a-1235, a-1236]
new_name_list = [(a-1235, a-5321), (a-1236, a-6321), (a-1234, a-4321), ... ]
我想递归搜索旧名称列表中的元素是否存在于新名称列表中,并返回与其关联的值,例如,旧名称列表中的第一个元素返回
a-4321
,第二个元素返回
a-5321
,依此类推,直到旧名称列表完成

我试过以下方法,但不起作用

for old_name, new_name in zip(old_name_list, new_name_list):
    if old_name in new_name[0]:
        print new_name[1]
我的方法是错误的还是我必须对它做一些小的改变?提前谢谢。

基于第二个列表构建一个
dict()
,并在其中查找

old_name_list = ["a-1234", "a-1235", "a-1236"]
new_name_list = [("a-1235", "a-5321"), ("a-1236", "a-6321"), ("a-1234", "a-4321") ]

d = dict(new_name_list)

for n in old_name_list:
    print d[n]
您确实需要在“a-1234”等字符串周围加引号。

使用以下方法:

found_items = [item[1] for item in new_name_list if item[0] in old_name_list]

使用字典可能是最好的方法

old_name_list = ['a-1234', 'a-1235', 'a-1236']
new_name_list = [('a-1235', 'a-5321'), ('a-1236', 'a-6321'), ('a-1234, a-4321')]
mapping = dict(new_name_list)
values = [mapping[item] if item in mapping for item in old_name_list]
print values

压缩
old\u name\u list
new\u name\u list
没有任何意义-这样,您只需检查
old\u name\u list
的第一个元素是否与第一对
new\u name\u list
匹配。请尝试打印
zip(old\u name\u list,new\u name\u list)
的结果,然后查看结果。在Python3.x中,您需要使用
list()
将其显式地强制放到一个列表中,以便查看它,但在Python2.x中
zip()
提供了一个列表。当您查看列表时,您将看到程序无法正常工作的原因
zip()。顺便说一下,您不应该在
中使用
=
来查看两个字符串是否相等。这个问题中没有任何东西需要递归。也许您要查找的单词是“反复”。我编辑了标题以删除“递归”一词。在列表中查找条目是O(n),其中n是列表的长度。这将至少使用Python内部的C代码来完成,而不是显式的Python循环,但对于大型列表来说,构建
dict()
并使用O(1)查找仍然要快得多。对于短列表,这与任何东西一样好,并且可能比构建
dict()
@steveha更快:虽然理论上这是正确的,但在实践中,此解决方案将与任何其他解决方案一样快。如果
n
不是现有值,您甚至可以使用
d.get(n)
,以避免
keyrerror
@Emmanuel:yes,好主意。或者在打印前使用
,如果d中有n: