猿问

将字典值映射到另一个字典的最佳方法是什么

我想知道什么是2种类型的字典合并成一个字典如下的最佳方式: dict1 = {k1: v1, k2: v2, ...}和dict2 = {v1: w1, v2: w2, ...}成 result = {k1: w1, k2: w2, ...}


我已经有了一个使用 dict comprehension 的解决方案:


result = {

   k: dict2[v]

   for k, v in dict1.items()

}

但我认为这不是最优雅的方式。你能帮我么 ?


狐的传说
浏览 253回答 2
2回答

ABOUTYOU

作为替代/扩展,对于@jpp 的回答,您还可以使用reduce/functools.reduce来获得更简洁的chainer函数形式:from functools import reducedef 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(并且可能根本不需要)。

德玛西亚99

对于两个字典的情况,您的字典理解很好。这假设您可以保证您的值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 resres = chainer(dict1, dict2, dict3)# {'k1': 'x1', 'k2': 'x2'}
随时随地看视频慕课网APP

相关分类

Python
我要回答