递归遍历带有列表的嵌套字典,并替换匹配的值。

11

我想创建一个函数,用于遍历包含列表的嵌套字典。对于每个与关键字匹配的值,该函数将其替换为另一个关键字。

函数返回另一个字典或更改主字典都不重要。

我试图分离情况: - 如果数据是字典,则执行某些操作 - 如果数据是列表,则执行其他操作

字典:


data_dict = {
  "name": "AAAAAA",
  "content": "BBBBBB",
  "dat": [
    {
      "author": {
        "name": "CCCCCC",
        "surname": "DDDDDD",
      },
      "title": "FFFFFF",
      "color": 15258703,
      "fields": [
        {
          "name": "GGGGGG",
          "value": "HHHHHH",
        },
        {
          "name": "IIIIII",
          "value": "JJJJJJ",
        }

      ],
      "thumbnail": {
        "url": "KKKKKK"
      },
      "image": {
        "url": "LLLLLL"
      },
      "footer": {
        "text": "MMMMMMM",
        "icon_url": "NNNNNN"
      }
    }
  ]
}


现在我只是尝试更改每个值,以查看是否可以正常迭代。 我可以打印出所有值已更改的data_dict,但无法在字典中进行管理...


def recursive_replace_valuer(data, match, repl):

    if isinstance(data, list):
        for l in data:
            recursive_replace_valuer(l, match, repl)
            if isinstance(l, dict):
                recursive_replace_valuer(l, match, repl)




    elif isinstance(data, dict):
        for k,v in data.items():
            recursive_replace_valuer(v, match, repl)
            data[k] = '______'
        print(data)

recursive_replace_valuer(data_dict, 'a','a')
1个回答

21

该函数应该递归地将函数应用于字典或列表中的值,直到输入的data既不是字典也不是列表为止,此时如果给定数据匹配给定搜索字符串match,则返回替换值repl

def replace(data, match, repl):
    if isinstance(data, dict):
        return {k: replace(v, match, repl) for k, v in data.items()}
    elif isinstance(data, list):
        return [replace(i, match, repl) for i in data]
    else:
        return repl if data == match else data

或者,为了替换原始数据,请使函数迭代给定的字典或列表,并通过键(对于字典)或索引(对于列表)替换值,如果它匹配,则在原地进行操作,并递归地将函数应用于该值:

def replace(data, match, repl):
    if isinstance(data, (dict, list)):
        for k, v in (data.items() if isinstance(data, dict) else enumerate(data)):
            if v == match:
                data[k] = repl
            replace(v, match, repl)

如果值是一个set呢? - Basil Musa
@BasilMusa 只需添加 elif isinstance(data, set): return {replace(i, match, repl) for i in data} - blhsing
迭代期间字典键已更改 - Amulya Acharya
@AmulyaAcharya 你是在谈论“RuntimeError: dictionary changed size during iteration”错误吗?你能提供一个可以导致此错误的示例输入数据集吗?所有data[k] = repl所做的就是将新值分配给现有键,因此我不明白它如何可能改变字典的大小以产生该错误。 - blhsing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接