如何遍历嵌套字典生成以ID为标识的结构化列表?
解决嵌套字典转条目列表的问题
嘿,我明白你的问题啦!你遇到的[None, None, None, None]问题,是因为在循环里用了字符串'i'而不是变量i——v.get('i')会去每个字段字典里找键为'i'的值,而不是你循环的数字键(比如20、21),所以自然找不到,返回None。
下面给你两种可行的解决方案,都能帮你遍历所有数字键,生成你需要的条目列表:
方法一:分步循环(可读性高)
先拿到所有的数字键(假设所有字段的键都是一致的,比如Name里的键就是所有条目ID),然后逐个键去收集每个字段对应的值:
# 你的原始嵌套字典 table_2 = { 'Name': {'20': 'Paul Merrill', '21': 'Brynne S. Barr'}, 'Phone': {'20': '1-313-739-3854', '21': '939-4818'}, 'Address': {'20': '916-8087 Vehicula Rd.', '21': '878-2231 Suspendisse Rd.'}, 'City': {'20': 'Le Mans', '21': 'Wilhelmshaven'} } result = [] # 获取所有数字键(从任意一个字段的字典里取即可) entry_ids = table_2['Name'].keys() for entry_id in entry_ids: # 每个条目先以数字键开头 current_entry = [entry_id] # 遍历每个字段,取出对应ID的值 for field_data in table_2.values(): # 如果怕有缺失键,可以用field_data.get(entry_id, '')替代field_data[entry_id] current_entry.append(field_data[entry_id]) result.append(current_entry) print(result)
运行后就会得到你想要的结果:
[ ['20', 'Paul Merrill', '1-313-739-3854', '916-8087 Vehicula Rd.', 'Le Mans'], ['21', 'Brynne S. Barr', '939-4818', '878-2231 Suspendisse Rd.', 'Wilhelmshaven'] ]
方法二:列表推导式(简洁高效)
如果喜欢更紧凑的代码,可以用嵌套列表推导式一步完成:
entry_ids = table_2['Name'].keys() result = [[entry_id] + [field[entry_id] for field in table_2.values()] for entry_id in entry_ids]
这个和方法一的逻辑完全一致,只是写法更简洁,适合熟悉列表推导式的场景。
小提示
如果你的数据里可能存在某个字段缺失某个数字键的情况,建议用field.get(entry_id, '')替代field[entry_id],这样不会抛出KeyError,而是返回你指定的默认值(比如空字符串),让程序更健壮。
内容的提问来源于stack exchange,提问作者shadowrain
相关产品推荐
相关产品推荐

