[英]Pythonic way to extract keys and multiple values from a list of dicts
I have some code which works, data is read in from a text file as a list of dicts, the code takes the keys and values from each dict in for loops.我有一些有效的代码,从文本文件中读取数据作为字典列表,代码从 for 循环中的每个字典中获取键和值。 While it works I am sure there is a better way to do it than mine below:
虽然它有效,但我确信有比下面的更好的方法来做到这一点:
Code代码
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)
Outputs输出
['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']
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 = [data_point['Clk'] for data_point in data_list] # shortcode for creating list with iterator
av_50 = [data_point['50%'] for data_point in data_list]
av_100 = [data_point['100%'] for data_point in data_list]
You can use zip to go through the dictionaries and map the 3 fields onto individual lists:您可以通过字典使用 zip 到 go 和 map 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']
For a more generalized formulation, you can separate the keys from the list comprehension:对于更通用的公式,您可以将键与列表理解分开:
keys = ("Clk","50%","100%")
Clk,av_50,av_100 = map(list,zip(*(map(d.get,keys) for d in data_list)))
This would allow creation of a generalized key extraction function:这将允许创建通用密钥提取 function:
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%")
I would recommand using pandas.DataFrame
very convenient way to我建议使用
pandas.DataFrame
非常方便的方法
import pandas as pd
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'}]
my_data=pd.DataFrame(data_list)
clk = my_data['Clk'].tolist()
clk
Regards问候
Felix's answer works, but if you want to keep the check if the key exists, you could do this: Felix 的回答有效,但如果您想继续检查密钥是否存在,您可以这样做:
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 = [dicty["Clk"] for dicty in data_list if "Clk" in dicty.keys()]
av_50 = [dicty["50%"] for dicty in data_list if "50%" in dicty.keys()]
av_100 = [dicty["100%"] for dicty in data_list if "100%" in dicty.keys()]
Basic (and best) solution without any extra library:没有任何额外库的基本(和最佳)解决方案:
clk = []
av_50 = []
av_100 = []
for item in data_list:
clk.append(item['Clk'])
av_50.append(item['50%'])
av_100.append(item['100%'])
print(clk)
print(av_50)
print(av_100)
More elegant solution with list comprehensions, although less efficient because it requires three iterations over data_list
instead of just one required from the previous approach更优雅的列表推导解决方案,虽然效率较低,因为它需要对
data_list
进行三次迭代,而不是前一种方法只需要一次
clk = []
av_50 = []
av_100 = []
clk = [item['Clk'] for item in data_list]
av_50 = [item['50%'] for item in data_list]
av_100 = [item['100%'] for item in data_list]
print(clk)
print(av_50)
print(av_100)
It might convenient to use dynamic collection of data, in case your dict structure might change over time.使用动态数据收集可能很方便,以防您的 dict 结构可能随着时间而改变。 This will work for your
data_list
:这将适用于您的
data_list
:
def explode(data_list):
keys = list(data_list[0].keys())
values = [[d[k] for k in keys] for d in data_list]
return keys, values
keys, values = explode(data_list)
Then print(keys)
outputs然后
print(keys)
输出
['Clk', '50%', '100%'`]
and print(values)
:和
print(values)
:
[['190', '5.3149999999999995', '4.715'], ['195', '5.295', '4.765'], ['200', '5.395', '4.9'], ['205', '5.55', '4.970000000000001'], ['210', '5.68', '5.005'], ['215', '5.725', '5.08'], ['220', '5.85', '5.215'], ['225', '6.03', '5.35'], ['230', '6.140000000000001', '5.395'], ['235', '6.074999999999999', '5.37'], ['240', '6.02', '5.345'], ['245', '6.025', '5.49'], ['290', '5.67', '5.37']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.