Python将列表嵌套字典转换为扁平字典的方法
本文介绍如何将Python中形如[{'a': 97}, {'b': 98}]的列表嵌套字典转换为单一字典。通过结合range生成字母序列,利用map函数构建初始列表,再借助字典的items()方法提取键值对,最后通过双重循环遍历合并至新字典,实现数据结构的扁平化处理。
Python列表嵌套字典转换概述
在观看视频教程时,遇到了形如[{'a': 97}, {'b': 98}, {'c': 99}, {'d': 100}, {'e': 101}, ...]的列表嵌套字典结构,
目标是将上述列表转换为{'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101, ...}的单一字典形式。
首先,上述示例中a对应97、b对应98等,表示key为a到z的小写英文字母,value为对应的ASCII码值,
构建初始列表数据
因此,可以结合range()方法定义变量如下:

即alpha = ['a', 'b', 'c', ..., 'z']
生成[{'a': 97}, {'b': 98}, {'c': 99}, {'d': 100}, {'e': 101}, ...]的代码可以结合map()函数来生成

函数运行结果:

这实际上是遍历打印[{'a': 97}, {'b': 98}, {'c': 99}, {'d': 100}, {'e': 101}, ...]的结果。
利用items()方法转换字典
接下来需要将上述形式转换为
{'a' : 97,'b' : 98,'c' : 99 ,'d' : 100,'e' : 101,。。。。。}
本人采用的是Python字典中的items()函数方法:
i.items()的作用:使 { x: y } 转换为 [(x, y)]
结果就是:
{'a' : 97}, {'b' : 98}, {'c' : 99}, {'d' : 100}, {'e' : 101}, ...........---------》 [('a' , 97)],[('b' : 98)],........
即一个i.items()代表一个[(x, y)]的字典列表
通过双重循环遍历输出i.items()结果:


程序的目的是获取对应的key和value值:


然后将上述数据放入新定义的空字典中:


判断字典嵌套与遍历示例
补充:Python判断字典是否嵌套及嵌套字典列表
如下所示:
#coding: utf-8
import types
#获取字典中的objkey对应的值,适用于字典嵌套
#dict:字典
#objkey:目标key
#default:找不到时返回的默认值
def dict_get(dict, objkey, default):
tmp = dict
for k,v in tmp.items():
if k == objkey:
return v
else:
if type(v) is types.DictType:
ret = dict_get(v, objkey, default)
if ret is not default:
return ret
return default
#如
dicttest={"result":{"code":"110002","msg":"设备设备序列号或验证码错误"}}
ret=dict_get(dicttest, 'msg', None)
print(ret)
字典的列表
"network": {
"tls": [],
"udp": [
{
"src": "192.168.56.102",
"dst": "114.114.114.114",
"offset": 2372,
"time": 9.506472110748291,
"dport": 53,
"sport": 51394
},
{
"src": "192.168.56.102",
"dst": "114.114.114.114",
"offset": 2611,
"time": 2.232347011566162,
"dport": 53,
"sport": 53604
}]
}
for k,v in mydict.items():
if type(v) is types.ListType:
for val in v:
if type(val) is types.DictType:
for key,value in val.items():
print("%s:%s"%(key,value))
else:
print("%s:%s"%(k,v))
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













