比较两个字典并更改第二个字典中的键(如果键作为第一个字典中的子值存在)
如果 d2
的键与 d1
中 id
的值匹配,则需要帮助重新映射 d2
的键。如果存在不匹配的密钥,请将其丢弃。
d1={'A':{'id':'a'},'B':{'id':'b'}}
d2={'a':1,'b':2, 'c':3}
预期输出:
{'A': 1, 'B': 2}
Need help remapping the keys for d2
if they match the value for id
in d1
. In case there are keys that are unmatched, drop them.
d1={'A':{'id':'a'},'B':{'id':'b'}}
d2={'a':1,'b':2, 'c':3}
Expected output:
{'A': 1, 'B': 2}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以遍历
d1
并使用d2
作为查找来修改值:如果您想修改
df2
,您可以使用字典理解:或使用两个循环(一次修改 df1 中存在的键的值,一次删除 df1 中不存在的任何键):
输出:
You could traverse
d1
and used2
as a lookup to modify values:If you want to modify
df2
instead, you could use a dict comprehension:or use two loops (once to modify values of keys that exist in
df1
and once to remove any keys that don't exist indf1
):Output:
这可能就是您想要的
但是,未映射的值将保持不变(即,如果有
C
,但其映射中没有id
,或者没有c
ind2
..)如果您想丢弃未映射的值,您可以在 except 中使用
del d1[key]
执行此操作,或者简单地创建一个新值字典将键和值打包到(如果引发 KeyError)或者,如果这是一个错误(即
C
必须 存在),您可以简单地让KeyError
向调用者引发并让它处理后果This is probably what you're after
However, unmapped values will remain the same (ie if there is
C
, but noid
in its mapping, or noc
ind2
..)If you want to discard unmapped values, you could do so here with
del d1[key]
in the except or simply create a new dict to pack the keys and values into (never added if KeyError is raised)Alternatively, if this is an error (ie.
C
must exist), you can simply letKeyError
raise to the caller and have it deal with the consequences只要每个 'val' 在
d1
的子词典中最多出现一次(即d1
中的 key: {'id': val} 对),就可以迭代在d1
的项目上,如下所示:由于您需要检查
d1
中的所有键值对,因此从时间和空间效率角度来看,这是您能做的最好的事情。但是,如果您要使用相同的
d1
来“重新键入”许多d2
字典,则构建反向索引以供重用可能会更快:As long as each 'val' appears at most once in
d1
's subdictionaries (i.e. the key: {'id': val} pairs ind1
), you can iterate overd1
's items like so:Since you need to check all key-value pairs in
d1
, this is the best you can do in terms of time and space efficiency.However, if you will be 're-keying' many
d2
dictionaries with the samed1
, it may be faster to build a reverse-index to reuse: