python - 从字典列表中提取键和多个值的 Pythonic 方法
问题描述
我有一些有效的代码,从文本文件中读取数据作为字典列表,代码从 for 循环中的每个字典中获取键和值。虽然它有效,但我确信有比下面的更好的方法来做到这一点:
代码
data_list = [{'Clk': '190', '50%': '5.3149999999999995', '100%': '4.715'},
{'Clk': '195', '50%': '5.295', '100%': '4.765'},
{'Clk': '200', '50%': '5.395', '100%': '4.9'},
{'Clk': '205', '50%': '5.55', '100%': '4.970000000000001'},
{'Clk': '210', '50%': '5.68', '100%': '5.005'},
{'Clk': '215', '50%': '5.725', '100%': '5.08'},
{'Clk': '220', '50%': '5.85', '100%': '5.215'},
{'Clk': '225', '50%': '6.03', '100%': '5.35'},
{'Clk': '230', '50%': '6.140000000000001', '100%': '5.395'},
{'Clk': '235', '50%': '6.074999999999999', '100%': '5.37'},
{'Clk': '240', '50%': '6.02', '100%': '5.345'},
{'Clk': '245', '50%': '6.025', '100%': '5.49'},
{'Clk': '290', '50%': '5.67', '100%': '5.37'}]
#print(data_list)
#print('\n'*3)
Clk = []
av_50 = []
av_100 = []
for dicty in data_list:
for k,v in dicty.items():
#print(" ", v)
if k == "Clk":
Clk.append(dicty["Clk"])
if k == "50%":
av_50.append(dicty["50%"])
if k == "100%":
av_100.append(dicty["100%"])
print('\n'*3)
print(Clk)
print('\n')
print(av_50)
print('\n')
print(av_100)
输出
['190', '195', '200', '205', '210', '215', '220', '225', '230', '235', '240', '245', '290']
['5.3149999999999995', '5.295', '5.395', '5.55', '5.68', '5.725', '5.85', '6.03', '6.140000000000001', '6.074999999999999', '6.02', '6.025', '5.67']
['4.715', '4.765', '4.9', '4.970000000000001', '5.005', '5.08', '5.215', '5.35', '5.395', '5.37', '5.345', '5.49', '5.37']
解决方案
您可以使用 zip 浏览字典并将 3 个字段映射到各个列表:
data_list = [{'Clk': '190', '50%': '5.3149999999999995', '100%': '4.715'},
{'Clk': '195', '50%': '5.295', '100%': '4.765'},
{'Clk': '200', '50%': '5.395', '100%': '4.9'},
{'Clk': '205', '50%': '5.55', '100%': '4.970000000000001'},
{'Clk': '210', '50%': '5.68', '100%': '5.005'},
{'Clk': '215', '50%': '5.725', '100%': '5.08'},
{'Clk': '220', '50%': '5.85', '100%': '5.215'},
{'Clk': '225', '50%': '6.03', '100%': '5.35'},
{'Clk': '230', '50%': '6.140000000000001', '100%': '5.395'},
{'Clk': '235', '50%': '6.074999999999999', '100%': '5.37'},
{'Clk': '240', '50%': '6.02', '100%': '5.345'},
{'Clk': '245', '50%': '6.025', '100%': '5.49'},
{'Clk': '290', '50%': '5.67', '100%': '5.37'}
]
Clk, av_50, av_100 = map(list,zip(*((d["Clk"],d["50%"],d["100%"]) for d in data_list)))
print(Clk)
print(av_50)
print(av_100)
['190', '195', '200', '205', '210', '215', '220', '225', '230', '235', '240', '245', '290']
['5.3149999999999995', '5.295', '5.395', '5.55', '5.68', '5.725', '5.85', '6.03', '6.140000000000001', '6.074999999999999', '6.02', '6.025', '5.67']
['4.715', '4.765', '4.9', '4.970000000000001', '5.005', '5.08', '5.215', '5.35', '5.395', '5.37', '5.345', '5.49', '5.37']
对于更通用的公式,您可以将键与列表理解分开:
keys = ("Clk","50%","100%")
Clk,av_50,av_100 = map(list,zip(*(map(d.get,keys) for d in data_list)))
这将允许创建通用密钥提取函数:
def listKeys(D,*keys):
return map(list,zip(*(map(d.get,keys) for d in D)))
Clk,av_50,av_100 = listKeys(data_list,"Clk","50%","100%")
推荐阅读
- c - How to pass "a pointer to a function with parameters" to another function
- bash - 如何检查文件是否存在并且是文本文件?
- vue.js - 在事件总线事件上打开模式对话框
- laravel - 如何在组件的脚本部分使用 vue-i18n 翻译功能
- rdf - rdfproc took forever to parse a 8.33 MB file?
- android - Duplicate object types in Apollo GraphQL for Android
- asp.net - 如何修复向我的应用程序提供错误 AD 身份的窗口?
- swift - 来自 url 的 Swift.Streaming 音频,错误代码为 -999 “已取消”
- elasticsearch - 如何在术语聚合下使用 bucket_script 聚合中的总命中数?
- jquery - 我如何在 vue.js 中使用来自 jquery.html() 的按钮的 onclick