如何替换嵌套di中的值

2024-06-11 09:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要不同的嵌套dict,我想用dictb中的相应值替换dicta中的一些键 这是迪克特A

{
  "Animals": {
    "catgry": {
      "1": "Dogs",
      "2": "Cats",
      "3": "Birds",
    }
  },
  "dogBreeds": {
    "catgry": {
      "1": "Belgian Malinois",
      "2": "Australian Bulledog",
      "3": "Cane Corso",
      "4": "Chow chow",
      "5": "Dalmatian",
      "6": "Dobermann",
      "7": "Labrador",
      "8": "Rottweiler"
    }
  }
}

而dict B是

^{pr2}$

我首先尝试从dicta中删除键“catgry”,然后用相应的键替换值,但是在不删除子元素的情况下没有成功

[编辑] 这是预期的结果

{
  "name": "MyGarden",
  "children": [
    {
      "Animals":"Dogs",
      "children": [
        {
          "dogBreeds":"Belgian Malinois",
          "children": [
            {
              "name": "myBelgian malinois",
              "weight": "30"
            }
          ]
        },
        {
          "dogBreeds":"Australian Bulledog",
          "children": [
            {
              "name": "myAustralian Bulledog",
              "weight": "35"
            }
          ]
        }
      ]
    }
  ]
}

Tags: namedictweightanimalschildrendogscatsaustralian
3条回答

您需要先创建一个新条目,然后删除旧条目。Change the name of a key in dictionary

可以使用递归:

a = {'Animals': {'catgry': {'1': 'Dogs', '2': 'Cats', '3': 'Birds'}}, 'dogBreeds': {'catgry': {'1': 'Belgian Malinois', '2': 'Australian Bulledog', '3': 'Cane Corso', '4': 'Chow chow', '5': 'Dalmatian', '6': 'Dobermann', '7': 'Labrador', '8': 'Rottweiler'}}}
b = {'name': 'MyGarden', 'children': [{'name': 'Animals', 'Animals': '1', 'children': [{'name': 'dogBreeds', 'dogBreeds': '1', 'children': [{'name': 'myBelgian malinois', 'weight': '30'}]}, {'name': 'dogBreeds', 'dogBreeds': '2', 'children': [{'name': 'myAustralian Bulledog', 'weight': '35'}]}]}]}
def rename(d):
  return {**d, 'children':list(map(rename, d.get('children', [])))} if d['name'] not in a else \
      {d['name']:a[d['name']]['catgry'][d[d['name']]], 'children':list(map(rename, d.get('children', [])))}

输出:

^{pr2}$

因此,我在这里对嵌套字典将包含的类型以及catgry子目录的存在做一些假设。在

但是你应该能够用递归来解决这个问题。在

def val_replace(dictb, refdict):
    for k, v in dictb.items():
        if k in refdict:
            dictb[k] = refdict[k]['catgry'][v]
        elif isinstance(v, dict):
            val_replace(v, refdict)
        elif isinstance(v, list):
            for v2 in v:
                if isinstance(v2, dict):
                    val_replace(v2, refdict)

myref = {
  "Animals": {
    "catgry": {
      "1": "Dogs",
      "2": "Cats",
      "3": "Birds",
    }
  },
  "dogBreeds": {
    "catgry": {
      "1": "Belgian Malinois",
      "2": "Australian Bulledog",
      "3": "Cane Corso",
      "4": "Chow chow",
      "5": "Dalmatian",
      "6": "Dobermann",
      "7": "Labrador",
      "8": "Rottweiler"
    }
  }
}

mydict = {
  "name": "MyGarden",
  "children": [
    {
      "name": "Animals",
      "Animals":"1",
      "children": [
        {
          "name": "dogBreeds",
          "dogBreeds":"1",
          "children": [
            {
              "name": "myBelgian malinois",
              "weight": "30"
            }
          ]
        },
        {
          "name": "dogBreeds",
          "dogBreeds":"2",
          "children": [
            {
              "name": "myAustralian Bulledog",
              "weight": "35"
            }
          ]
        }
      ]
    }
  ]
}

val_replace(mydict, myref)

结果是:

^{pr2}$

相关问题 更多 >