首页 > 解决方案 > 有没有办法从嵌套字典中访问一个值并根据搜索列表更新同一个字典中的值?

问题描述

dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': nan}}
{'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': nan}}

A_list = [2031111, 2031112, 2031113, 2042222, 2042223]

我的目标是搜索 A_list 以找到以 203 和 204 开头的第一个整数(2031111 和 2042222)并更新相应的 soft_DN 值。

更新后的 dict 应如下所示:

dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': 2031111}}
{'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': 2042222}}

标签: pythonpython-3.7

解决方案


首先你的 dict 格式不正确,我想它应该是这样的:

dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': None},
      'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': None}}

这样做的简单方法是将数字转换为字符串,然后将前 3 个字符与dn_range

>>> int(str(2031111)[:3])
203

也就是说,我不知道您的数据集有多大,如果它非常大,您希望通过减少在迭代字典时循环列表的次数来节省时间。为此,我建议使用itertools.groupby获取键的字典作为整数的前 3 位数字,而值是显示的第一个整数。也就是说,请确保您的整数按前 3 个字符组合在一起,否则您将需要另一种方法来执行此操作。

from itertools import groupby
ranges = {int(k): next(v) for k, v in groupby(A_list, key=lambda i: str(i)[:3])}

结果:

{203: 2031111, 204: 2042222}

然后只需遍历字典并替换值

for k, d in dict_1.items():
    d['soft_DN'] = ranges.get(d['dn_range'])

结果:

{'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': 2031111}, 'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': 2042222}}

推荐阅读