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