【问题标题】:Python Iterating and Creating a Nested DictionaryPython 迭代和创建嵌套字典
【发布时间】:2021-11-29 09:06:21
【问题描述】:

我有一些数据采用以下格式(mylist),我正在尝试将其转换为嵌套字典,但努力使格式正确。我尝试了几种迭代和转换的变体,但无法获得所需的结果。我能否使用 mylist 中的数据格式获取所需格式的数据,如所需结果所示?

mylist = [
    [('floor', 'first_floor'), ('bed_room', 'room1'), ('windows', 2), ('color', 'violet')],
    [('floor', 'second_floor'), ('bed_room', 'room2'), ('windows', 4), ('color', 'violet')],
]

nest_keys = ['floor', 'bedroom']
cmd_tree = {}
for i in mylist:
    last_element = True
    for key in reversed(nest_keys):
        if last_element is True:
            cmd_tree = {key: dict([x for x in i if x[0] not in nest_keys])}
            last_element = False
        else:
            cmd_tree = {key: cmd_tree}

print(cmd_tree)

当前结果:

{'floor': {'bedroom': {'bed_room': 'room2', 'windows': 4, 'color': 'violet'}}}

期望的结果:

{'floor': {'first_floor': {'bed_room': {'room1': {'color': 'white',
                                                  'windows': 2}}},
           'second_floor': {'bed_room': {'room2': {'color': 'violet',
                                                   'windows': 4}}}}}

【问题讨论】:

  • 'windows'mylist 中的'color' 之前,您确定要在所需输出中的'color' 之后吗?

标签: python python-3.x dictionary iteration


【解决方案1】:

不需要反向循环,遍历列表,每次初始迭代都是一个楼层,然后遍历它的内容来创建楼层详细信息:

result = {}
br = 'bed_room'

for (_, floor_name), *details in mylist:
    result[floor_name] = {br: {}}
    
    for name, detail in details:
        if name == br:
            room = detail
            result[floor_name][br][room] = {}
        else:
            result[floor_name][br][room][name] = detail

print({'floor': result})

{'floor': {'first_floor': {'bed_room': {'room1': {'color': 'violet',
                                                  'windows': 2}}},
           'second_floor': {'bed_room': {'room2': {'color': 'violet',
                                                   'windows': 4}}}}}

【讨论】:

  • 非常感谢您的回复。请问for循环中的“_”和*details是做什么的?
  • 称为赋值拆包。请参阅:PEP 3132 了解更多详情
  • 如果这回答了您的问题,请随意标记它!
  • 我得到KeyError: 2 在线:result[floor_name][br][detail][name] = detail。你确定这行得通吗?
  • @SorousHBakhtiary 我清理错误。我编辑了。
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2023-01-18
  • 1970-01-01
相关资源
最近更新 更多