8

我正在尝试编写一个理解,它将按以下方式组成两个字典:

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。

提前致谢。

4

4 回答 4

11

一种方法是:

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

对于具有不在 d2 中的值的键,您想要什么行为?

于 2013-07-24T23:30:10.033 回答
6

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

>>> 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'}
于 2013-07-24T23:31:07.357 回答
2
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'}
于 2013-07-25T00:02:46.027 回答
2

即使不是所有的值d1都是有效的键,这种方法也有效d2

 {k1:d2[d1[k1]] for k1 in d1 if d1[k1] in d2}
于 2013-07-24T23:32:12.667 回答