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

Python:替换嵌套字典中的值

Python:替换嵌套字典中的值

慕田峪4524236 2022-01-11 16:59:44
只要键是' current_values ' ,我想用与integers相同的值替换值(格式化为字符串)。d = {'id': '10', 'datastreams': [{'current_value': '5'}, {'current_value': '4'}]}期望的输出:d = {'id': '10', 'datastreams': [{'current_value': 5}, {'current_value': 4}]}
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

以下代码替换字典中的值(的子字符串)。它适用于嵌套的 json 结构并处理 json、列表和字符串类型。如果需要,您可以添加其他类型。


def dict_replace_value(d, old, new):

    x = {}

    for k, v in d.items():

        if isinstance(v, dict):

            v = dict_replace_value(v, old, new)

        elif isinstance(v, list):

            v = list_replace_value(v, old, new)

        elif isinstance(v, str):

            v = v.replace(old, new)

        x[k] = v

    return x



def list_replace_value(l, old, new):

    x = []

    for e in l:

        if isinstance(e, list):

            e = list_replace_value(e, old, new)

        elif isinstance(e, dict):

            e = dict_replace_value(e, old, new)

        elif isinstance(e, str):

            e = e.replace(old, new)

        x.append(e)

    return x


# See input and output below

b = dict_replace_value(a, 'string', 'something')

输入:


a = {

    'key1': 'a string',

    'key2': 'another string',

    'key3': [

        'a string',

        'another string',

        [1, 2, 3],

        {

            'key1': 'a string',

            'key2': 'another string'

        }

    ],

    'key4': {

        'key1': 'a string',

        'key2': 'another string',

        'key3': [

            'a string',

            'another string',

            500,

            1000

        ]

    },

    'key5': {

        'key1': [

            {

                'key1': 'a string'

            }

        ]

    }

}

输出:


{

   "key1":"a something",

   "key2":"another something",

   "key3":[

      "a something",

      "another something",

      [

         1,

         2,

         3

      ],

      {

         "key1":"a something",

         "key2":"another something"

      }

   ],

   "key4":{

      "key1":"a something",

      "key2":"another something",

      "key3":[

         "a something",

         "another something",

         500,

         1000

      ]

   },

   "key5":{

      "key1":[

         {

            "key1":"a something"

         }

      ]

   }

}


查看完整回答
反对 回复 2022-01-11
?
噜噜哒

TA贡献1784条经验 获得超7个赞

d = {'id': '10', 'datastreams': [{'current_value': '5'}, {'current_value': '4'}]}


for elem in d['datastreams']:      # for each elem in the list datastreams

    for k,v in elem.items():       # for key,val in the elem of the list 

        if 'current_value' in k:   # if current_value is in the key

            elem[k] = int(v)       # Cast it to int

print(d)

输出:


{'id': '10', 'datastreams': [{'current_value': 5}, {'current_value': 4}]}


查看完整回答
反对 回复 2022-01-11
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

一种通用方法(假设您事先不知道 dict 的哪个键指向列表)将遍历 dict 并检查其值的类型,然后在需要时再次迭代到每个值。


在您的情况下,您的字典可能包含一个字典列表作为值,因此检查一个值是否为列表类型就足够了,如果是,则遍历列表并更改您需要的字典。


可以使用如下函数递归完成:


def f(d):

    for k,v in d.items():

        if k == 'current_value':

            d[k] = int(v)

        elif type(v) is list:

            for item in v:

                if type(item) is dict:

                    f(item)


>>> d = {'id': '10', 'datastreams': [{'current_value': '5'}, {'current_value': '4'}]}

>>> f(d)

>>> d

{'id': '10', 'datastreams': [{'current_value': 5}, {'current_value': 4}]}  


查看完整回答
反对 回复 2022-01-11
  • 3 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信