我想知道将2个字典合并为一个字典的最佳方法是:
dict1 = {k1: v1, k2: v2, ...}
和dict2 = {v1: w1, v2: w2, ...}
进入
result = {k1: w1, k2: w2, ...}
我已经有一个使用dict理解的解决方案:
result = {
k: dict2[v]
for k, v in dict1.items()
}
但是我不认为这是最优雅的方式。 你能帮我吗?
答案 0 :(得分:4)
对于两字典的情况,您的字典理解能力很好。假设您可以保证dict1
中的值是dict2
中的键。
考虑如何将其扩展到任意词典输入,可以使用for
循环:
dict1 = {'k1': 'v1', 'k2': 'v2'}
dict2 = {'v1': 'w1', 'v2': 'w2'}
dict3 = {'w1': 'x1', 'w2': 'x2'}
def chainer(first, *others):
res = first.copy() # make a copy to avoid overwriting dict1
for k, v in res.items():
for dct in others:
v = dct[v]
res[k] = v
return res
res = chainer(dict1, dict2, dict3)
# {'k1': 'x1', 'k2': 'x2'}
答案 1 :(得分:4)
作为@jpp's answer的替代/扩展,您还可以使用reduce
/ functools.reduce
来获得chainer
函数的精简形式:
from functools import reduce
def chainer(first, *others):
return {k: reduce(lambda x, d: d[x], others, v) for k, v in first.items()}
其中哪个更好主要取决于口味;用法和结果相同。
对于只有两个字典,您的字典理解力是恕我直言的,因为它得到的是一样的优雅。不过,如果第二个字典中没有键,则可能要使用get
或添加条件。
>>> dict1 = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
>>> dict2 = {'v1': 'w1', 'v2': 'w2'}
>>> {k: dict2.get(v, 'undefined') for k, v in dict1.items()}
{'k1': 'w1', 'k2': 'w2', 'k3': 'undefined'}
>>> {k: dict2[v] for k, v in dict1.items() if v in dict2}
{'k1': 'w1', 'k2': 'w2'}
在chainer
中添加这样的保护措施要复杂得多,特别是对于使用reduce
的此变体(可能根本没有必要)。