簡體   English   中英

Python - 迭代和更新嵌套字典和列表

[英]Python - iterate and update a nested dictionary & lists

有以下字典,其中一些值可以是字典列表:

{
  "A": [
    {
      "B": {
        "C": "D",
        "X": "CHNAGE ME"
      }
    },
    {
      "E": "F"
    }
  ],
  "G": {
    "Y": "CHANGE ME"
  }
}

我想遞歸迭代這些項目並更改值為“CHANGE ME”的鍵值對,因此結果將是:

{
  "A": [
    {
      "B": {
        "C": "D",
        "X.CHANGED": "CHANGED"
      }
    },
    {
      "E": "F"
    }
  ],
  "G": {
    "Y.CHANGED": "CHANGED"
  }
}

我發現的解決方案沒有處理值是列表的情況,例如:

import collections
def nested_dict_iter(nested):
    for key, value in nested.iteritems():
        if isinstance(value, collections.Mapping):
            for inner_key, inner_value in nested_dict_iter(value):
                yield inner_key, inner_value
        else:
            yield key, value

我怎樣才能實現我的目標?

使用遞歸

前任:

def update(data):
    for k, v in data.copy().items():
        if isinstance(v, dict):     # For DICT
            data[k] = update(v)
        elif isinstance(v, list):   # For LIST
            data[k] = [update(i) for i in v]
        elif v == 'CHANGE ME':      # Update Key-Value
            # data.pop(k)
            # OR
            del data[k]
            data[f"{k}.CHANGED"] = 'CHANGED'
    
    return data

print(update(data))

輸出:

{
    'A':[{'B': {'C': 'D', 'X.CHANGED': 'CHANGED'}}, {'E': 'F'}], 
    'G':{'Y.CHANGED': 'CHANGED'}
 }

注意:我沒有測試所有的極端情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM