为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2021-10-26 18:07:48
我想知道什么是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()}但我认为这不是最优雅的方式。你能帮我么 ?
查看完整描述

2 回答

?
ABOUTYOU

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(并且可能根本不需要)。


查看完整回答
反对 回复 2021-10-26
?
德玛西亚99

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


查看完整回答
反对 回复 2021-10-26
  • 2 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号