【问题标题】:In Python, how to concisely replace nested values in json data?在 Python 中,如何简洁地替换 json 数据中的嵌套值?
【发布时间】:2020-04-22 08:58:03
【问题描述】:

这是In Python, how to concisely get nested values in json data?的扩展

我从 JSON 加载数据并尝试替换任意嵌套值使用列表作为输入,其中列表对应于后继孩子的名称。我想要一个函数 replace_value(data,lookup,value) 通过将查找中的每个条目视为嵌套子项来替换数据中的值。

这是我正在尝试做的结构:

json_data = {'alldata':{'name':'CAD/USD','TimeSeries':{'dates':['2018-01-01','2018-01-02'],'rates':[1.3241,1.3233]}}}

def replace_value(data,lookup,value):
    DEFINITION

lookup = ['alldata','TimeSeries','rates']
replace_value(json_data,lookup,[2,3])

# The following should return [2,3]
print(json_data['alldata']['TimeSeries']['rates'])

我能够从 get_value() 开始,但对如何进行替换感到困惑。我并不固定于这种代码结构,但希望能够在给定连续子项列表和要替换的值的情况下以编程方式替换数据中的值。

注意:lookup 的长度可能为 1

【问题讨论】:

    标签: json python-3.x dictionary


    【解决方案1】:

    跟随查找直到我们倒数第二个,然后将值分配给当前对象中的最后一个查找

    def get_value(data,lookup):  # Or whatever definition you like
        res = data
        for item in lookup:
            res = res[item]
        return res
    
    def replace_value(data, lookup, value):
        obj = get_value(data, lookup[:-1])
        obj[lookup[-1]] = value
    
    json_data = {'alldata':{'name':'CAD/USD','TimeSeries':{'dates':['2018-01-01','2018-01-02'],'rates':[1.3241,1.3233]}}}
    
    lookup = ['alldata','TimeSeries','rates']
    replace_value(json_data,lookup,[2,3])
    
    print(json_data['alldata']['TimeSeries']['rates']) # [2, 3]
    

    如果您担心列表副本lookup[:-1],可以将其替换为iterator slice

    from itertools import islice
    
    def replace_value(data, lookup, value):
        it = iter(lookup)
        slice = islice(it, len(lookup)-1)
        obj = get_value(data, slice)
        final = next(it)
        obj[final] = value
    

    【讨论】:

    • 嗨@PatrickHaugh 如果你真的不知道所有的查找怎么办?如果 json 很大并且充满了孩子,而您只知道某处需要更改的“费率”?
    【解决方案2】:

    一旦你有get_value

    get_value(json_data, lookup[:-1])[lookup[-1]] = value
    

    【讨论】:

      【解决方案3】:

      您可以先获取最终子字典的父级,以便您可以引用它来更改最终键下该子字典的值:

      def replace_value(data, lookup, replacement):
          *parents, key = lookup
          for parent in parents:
              data = data[parent]
          data[key] = replacement
      

      这样:

      json_data = {'alldata':{'name':'CAD/USD','TimeSeries':{'dates':['2018-01-01','2018-01-02'],'rates':[1.3241,1.3233]}}}
      lookup = ['alldata','TimeSeries','rates']
      replace_value(json_data,lookup,[2,3])
      print(json_data['alldata']['TimeSeries']['rates'])
      

      输出:

      [2, 3]
      

      【讨论】:

        猜你喜欢
        • 2020-04-22
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 2021-06-13
        • 2021-10-24
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多