当前位置: 首页 > 知识库问答 >
问题:

如何在字典列表(Python 3)中重命名深度嵌套的键?

公孙新觉
2023-03-14

给出以下内容(很长的内容列表的一部分):

{'diet': {'Diet 0': {'gender': 0,
   'nutrients': {'Alcohol': {'min': 0, 'max': 14, 'unit': 'oz'},
    'Caffeine': {'min': 0, 'max': 400, 'unit': 'mg'},
    'Copper': {'min': 0, 'max': 0, 'unit': 'mg'},
    'Calcium': {'min': 1000, 'max': 2500, 'unit': 'mg'},
    'Choline': {'min': 425, 'max': 3500, 'unit': 'mg'},
    'Cholesterol': {'min': 0, 'max': 300, 'unit': 'mg'},
    'Fluoride': {'min': 0, 'max': 0, 'unit': 'mg'},
    'SaturatedFat': {'min': 0, 'max': -1, 'unit': 'g'},
    'VitaminA': {'min': 2330, 'max': 10000, 'unit': 'IU'},
    'VitaminC': {'min': 75, 'max': 2000, 'unit': 'mg'},
    'VitaminD': {'min': 15, 'max': 100, 'unit': 'mcg'},
    'VitaminE': {'min': 15, 'max': 1000, 'unit': 'mg'},
    'VitaminK': {'min': 0, 'max': 0, 'unit': 'mcg'},
    'VitaminB1': {'min': 1.1, 'max': 0, 'unit': 'mg'},
    'VitaminB2': {'min': 0, 'max': 0, 'unit': 'mg'},
    'VitaminB5': {'min': 0, 'max': 0, 'unit': 'mg'},
    'VitaminB3': {'min': 0, 'max': 0, 'unit': 'mg'},
    'VitaminB6': {'min': 0, 'max': 0, 'unit': 'mg'},
    'VitaminB12': {'min': 2.4, 'max': 999999999, 'unit': 'mcg'},
    'Fiber': {'min': 21, 'max': 70, 'unit': 'g'},
    'Folate': {'min': 400, 'max': 1000, 'unit': 'mcg'},
    'FolicAcid': {'min': 0, 'max': 0, 'unit': 'mcg'},
    'Iodine': {'min': 0, 'max': 0, 'unit': 'mcg'},
    'Iron': {'min': 18.0, 'max': 45, 'unit': 'mg'},
    'Magnesium': {'min': 310, 'max': 350, 'unit': 'mg'},
    'Manganese': {'min': nan, 'max': 0, 'unit': 'mg'},
    'Phosphorus': {'min': 700, 'max': 4000, 'unit': 'mg'},
    'Potassium': {'min': 2600, 'max': 0, 'unit': 'mg'},
    'Selenium': {'min': 0, 'max': 0, 'unit': 'mcg'},
    'Sodium': {'min': 500, 'max': 2300, 'unit': 'mg'},
    'Sugar': {'min': nan, 'max': 24, 'unit': 'g'},
    'Zinc': {'min': 8.0, 'max': 40, 'unit': 'mg'}}}}}

我的列表中有10000个这样的DICT,我想将SaturatedFat键更改为saturatefat。使用ast尝试:

import ast
ast.literal_eval(str(diet_specs_dicts[0]).replace("'SaturatedFat':","'Saturated Fat':"))

返回一个错误:

--------------------------------------------------------------------------- ValueError Traceback(最近的调用最后)在1导入ast---

/usr/lib/python3.8/ast.pyliteral_eval(node_or_string)97返回左-右98返回_convert_signed_num(节点)---

/usr/lib/python3.8/ast.py在_convert(节点)86如果len(node.keys)!=len(node.values): 87_raise_malformed_node(节点)---

/usr/lib/python3.8/ast.py在_convert(节点)86如果len(node.keys)!=len(node.values): 87_raise_malformed_node(节点)---

/usr/lib/python3.8/ast.py在_convert(节点)86如果len(node.keys)!=len(node.values): 87_raise_malformed_node(节点)---

/usr/lib/python3.8/ast.py在_convert(节点)86如果len(node.keys)!=len(node.values): 87_raise_malformed_node(节点)---

/usr/lib/python3.8/ast.py在_convert(节点)86如果len(node.keys)!=len(node.values): 87_raise_malformed_node(节点)---

/usr/lib/python3.8/ast.py在_convert(节点)96其他: 97返回左-右---

/usr/lib/python3.8/ast.py在_convert_signed_num(节点)73其他: 74返回-操作数---

/usr/lib/python3。8/ast。py in _convert_num(节点)64 def _convert_num(节点):65如果不在(节点,常量)或类型(节点.值)不在(int,float,complex):---

/usr/lib/python3。8/ast。py in_raise_格式错误的_节点(node)61 node_或_string=node_或_string。主体62 def_raise_畸形节点(节点):---

错误:格式错误的节点或字符串

共有2个答案

寿和通
2023-03-14

可以使用递归函数来更改嵌套层次结构中出现的键:

为函数定义中的输入错误而编辑

>>> d = {'diet': {'Diet 0': {'gender': 0,
...:    'nutrients': {'Alcohol': {'min': 0, 'max': 14, 'unit': 'oz'},
...:     'Caffeine': {'min': 0, 'max': 400, 'unit': 'mg'},
...:     'SaturatedFat': {'min': 0, 'max': -1, 'unit': 'g'},
...:     'VitaminA': {'min': 2330, 'max': 10000, 'unit': 'IU'}}}}}

>>> def replace_key(d, old_key, new_key):
...:     for k, v in tuple(d.items()):
...:          if k == old_key:
...:              d[new_key] = d.pop(old_key)
...: 
...:          if isinstance(v, dict):
...:              replace_key(v, old_key, new_key)
...: 

>>> replace_key(d, old_key='SaturatedFat', new_key='Saturated Fat')
>>> d
{'diet': {'Diet 0': {'gender': 0,
   'nutrients': {'Alcohol': {'min': 0, 'max': 14, 'unit': 'oz'},
    'Caffeine': {'min': 0, 'max': 400, 'unit': 'mg'},
    'VitaminA': {'min': 2330, 'max': 10000, 'unit': 'IU'},
    'Saturated Fat': {'min': 0, 'max': -1, 'unit': 'g'}}}}}

此函数就地更改字典,并返回,但很容易修改为返回副本,保持原始字典不变:

>>> import copy
>>> def replace_key(d, old_key, new_key):
...:     d = copy.deepcopy(d)
...:     for k, v in tuple(d.items()):
...:          if k == old_key:
...:              d[new_key] = d.pop(old_key)
...: 
...:          if isinstance(v, dict):
...:              replace_key(v, old_key, new_key)
...: 
...:     return d
高博涉
2023-03-14

在这里你去

lst = [{'diet': {'Diet 0': {'gender': 0,
   'nutrients': {'Alcohol': {'min': 0, 'max': 14, 'unit': 'oz'},
    'Caffeine': {'min': 0, 'max': 400, 'unit': 'mg'},
    'Copper': {'min': 0, 'max': 0, 'unit': 'mg'},
    'Calcium': {'min': 1000, 'max': 2500, 'unit': 'mg'},
    'Choline': {'min': 425, 'max': 3500, 'unit': 'mg'},
    'Cholesterol': {'min': 0, 'max': 300, 'unit': 'mg'},
    'Fluoride': {'min': 0, 'max': 0, 'unit': 'mg'},
    'SaturatedFat': {'min': 0, 'max': -1, 'unit': 'g'},
    'VitaminA': {'min': 2330, 'max': 10000, 'unit': 'IU'},
    'VitaminC': {'min': 75, 'max': 2000, 'unit': 'mg'},
    'VitaminD': {'min': 15, 'max': 100, 'unit': 'mcg'},
    'VitaminE': {'min': 15, 'max': 1000, 'unit': 'mg'},
    'VitaminK': {'min': 0, 'max': 0, 'unit': 'mcg'},
    'VitaminB1': {'min': 1.1, 'max': 0, 'unit': 'mg'},
    'VitaminB2': {'min': 0, 'max': 0, 'unit': 'mg'},
    'VitaminB5': {'min': 0, 'max': 0, 'unit': 'mg'},
    'VitaminB3': {'min': 0, 'max': 0, 'unit': 'mg'}, ............................]

for d in lst:
    d['Saturated Fat'] = d.pop('SaturatedFat')
print(lst)
 类似资料:
  • 问题内容: 我的应用程序中有一个非常复杂的数据结构,需要对其进行操作。我试图跟踪玩家在他们的花园中有多少种错误。有十种错误,每种错误都有十种模式,每种模式都有十种颜色。所以可能有1000个独特的错误,我想追踪玩家每种类型的错误数量。嵌套的字典如下所示: 我没有使用此语法的任何错误或投诉。 当我想增加播放器的错误收集时,请执行以下操作: 我收到此错误: 字符串不能转换为’DictionaryInde

  • 问题内容: 我已经从网站下载了json数据,我想从嵌套的json中选择特定的key:values。我将json转换为python字典。然后,我使用字典理解来选择嵌套的key:values,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。您能建议一个更好的方法吗? 我的方法: 从datetime导入datetime,timedelta 问题答案: 我建议您使用,具有完

  • 问题内容: 我已经从网站下载了json数据,我想从嵌套的json中选择特定的key:values。我将json转换为python字典。然后,我使用字典理解来选择嵌套的key:values,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。您能建议一个更好的方法吗? 我的方法: 从datetime导入datetime,timedelta 问题答案: 我建议您使用,具有完

  • 问题内容: 我有类似的东西 并且需要具有: 非常感谢! 编辑:我想按subkey1进行排序,这之前还不清楚。 问题答案: 使用关键字表示功能和方法: 演示: 假定 所有 顶级词典都具有一个键,该键被假定为带有键的字典。 有关更多详细信息和技巧,请参见Python Sorting HOWTO 。

  • 问题内容: 我正在寻找一种使用dict update内容更新dict dictionary1的方法 我知道update会删除level2中的值,因为它正在更新最低的密钥level1。 鉴于dictionary1和update可以有任何长度,我该如何解决? 问题答案: @FM的答案具有正确的总体思路,即递归解决方案,但有些特殊的编码和至少一个错误。我建议改为: Python 2: Python 3:

  • 问题内容: 我正在处理一个复杂的嵌套字典和列表数据结构。我需要将数据展平并将所有嵌套项都置于0级。有关更多说明,请参见以下示例: 我需要将其展平为: 我从这篇文章的第一个答案中获得了参考,但是只有在我嵌套了字典的情况下它才可以工作,如果列表嵌套在字典中并且更多的词典嵌套在这些列表中,则它不能工作。 我对代码做了一些修改以适合我的用例,但是此代码不起作用 当我在此处粘贴代码时,缩进变得混乱。但我真的

  • 问题内容: 我有以下格式的字典: 演示代码: 我无法获得嵌套字典在内存中的存储方式,因为size如果是136个字节,size是80个字节,而且size是520个字节。 另外,当我对类型从到的变量数据进行类型转换时,字符串变量的大小为。 演示代码: 可以解释一下为什么吗? 问题答案: 字典和列表存储 引用 (类似于Python中的其他所有标准容器)。不遵循引用,它给你的C结构的内存占用 唯一 。引用

  • 问题内容: 我有一个数据框,我想根据另一个计划用作字典的数据框重命名列。例如,我拥有的第一个数据框是: 作为第二个数据框,我想用作字典: 我想得到的结果如下: 最初,我想将第一个数据框重塑为长格式,然后与字典数据框合并,然后重塑为宽格式。但是我认为这效率很低,因此我想使用一种更有效的方法(如果存在)。非常感谢您的帮助。 问题答案: 我觉得你可以先创建从,然后创建从列由您再使用: