2 回答

TA贡献1812条经验 获得超5个赞
作为替代/扩展,对于@jpp 的回答,您还可以使用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或添加条件,以防第二个 dict 中不存在键。
>>> 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(并且可能根本不需要)。

TA贡献1770条经验 获得超3个赞
对于两个字典的情况,您的字典理解很好。这假设您可以保证您的值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'}
添加回答
举报