This is what I've got so far:
{ k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 }
你应该注意两点:
1)当您直接在字典上使用 for-in 循环时:
for (k1, v1) in some_dict:
python 循环遍历字典中的键,即 for-in 循环等效于:
for (k1, v1) in some_dict.keys()
但是你告诉python每次通过循环都会返回一个两个元组,(k1,v1),并且python每次通过循环只返回一个键。所以这是一个错误。您可以通过编写以下内容来纠正它:
for (k1, v1) in some_dict.items()
items() 函数每次循环都会返回一个两个元组:(key, value)。
2)假设你有这个数据:
data = [
[1, 2, 3],
['a', 'b', 'c']
]
要遍历这六个值中的每一个,写起来感觉很自然:
results = [x for x in inner_array for inner_array in data]
但这会产生错误:
Traceback (most recent call last):
File "1.py", line 5, in <module>
results = [x for x in inner_array for inner_array in data]
NameError: name 'inner_array' is not defined
为了使其工作,循环必须“向后”编写:
results = [x for inner_array in data for x in inner_array]
print results
--output:--
[1, 2, 3, 'a', 'b', 'c']
我认为记住这一点的最简单方法是:循环的顺序与您在没有列表理解的情况下编写它们的顺序相同:
results = []
for inner_array in data:
for x in inner_array:
results.append(x)
就个人而言,我希望在 python 中看到这种变化,以便在 list/dict/set 理解中,您可以从“由内而外”工作,就像您写的那样。无论如何,这就是您的代码在更改后的样子:
d1 = {1:'a',2:'b',3:'c'}
d2 = {'a':'A','b':'B','c':'C'}
results = {
k1: v2
for (k2,v2) in d2.items()
for (k1,v1) in d1.items() if v1 == k2
}
print results
--output:--
{1: 'A', 2: 'B', 3: 'C'}