Python:编写两个词典的理解

Python:编写两个词典的理解,python,Python,我试图写一篇理解文章,用以下方式组成两本词典: d1 = {1:'a',2:'b',3:'c'} d2 = {'a':'A','b':'B','c':'C'} result = {1:'A',2:'B',3:'C'} 也就是说,结果字典由第一个字典的键和第二个字典的值组成,其中第一个字典的值等于第二个字典的键 到目前为止,我得到的是: { k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 } 但它不起作用。我是Python新手,所以我

我试图写一篇理解文章,用以下方式组成两本词典:

d1 = {1:'a',2:'b',3:'c'}
d2 = {'a':'A','b':'B','c':'C'}
result = {1:'A',2:'B',3:'C'}
也就是说,结果字典由第一个字典的键和第二个字典的值组成,其中第一个字典的值等于第二个字典的键

到目前为止,我得到的是:

{ k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 }
但它不起作用。我是Python新手,所以我不确定这是否真的有意义。顺便说一下,我正在使用python 3.3.2

提前感谢。

一种方法是:

result = {k: d2.get(v) for k, v in d1.items()}

对于具有不在d2中的值的键,您希望执行什么操作?

只需循环遍历
d1
的项,然后对于要放入结果中的每个元素,不要使用
d1
中的值,而是使用
d1
的值作为键在
d2
中查找新值:

>>> d1 = {1: 'a', 2: 'b', 3: 'c'}
>>> d2 = {'a': 'A', 'b': 'B', 'c': 'C'}
>>> d = {k: d2[v] for (k, v) in d1.items()}
>>> d
{1: 'A', 2: 'B', 3: 'C'}

即使并非
d1
中的所有值都是
d2
的有效键,这种方法仍然有效:

 {k1:d2[d1[k1]] for k1 in d1 if d1[k1] in d2}
你应该注意两件事:

1) 直接在dict上使用for in循环时:

for (k1, v1) in some_dict:
python在dict中的键上循环,即for in循环相当于:

for (k1, v1) in some_dict.keys()
但是您告诉python,每次通过循环都会返回一个两元组(k1,v1),python每次通过循环只返回一个键。所以这是一个错误。您可以通过以下方式更正此问题:

for (k1, v1) in some_dict.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 = [] 

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'}

+1当
d2
d1
中没有某个值的键时,不会崩溃。非常感谢。我有一个固定的输入集,我知道它有这种格式,所以如果我不指定该行为就可以了。要省略不匹配的键,您可以使用
{k:d2[v]表示d1中的k,v。items()如果d2中的v}
谢谢大家,希望我能接受不止一个。@Roma149,检查一下我对您在编写dict理解时所犯错误的解释可能会有所帮助。哇,出色的解释,我真的很感激。看来我的说法还是有道理的:)
results = [] 

for inner_array in data:
    for x in inner_array:
        results.append(x)
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'}