Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从dict列表中提取键和多个值的Pythonic方法_Python_List_Dictionary - Fatal编程技术网

从dict列表中提取键和多个值的Pythonic方法

从dict列表中提取键和多个值的Pythonic方法,python,list,dictionary,Python,List,Dictionary,我有一些代码可以工作,数据从一个文本文件中读取,作为一个dict列表,代码从每个dict中获取键和值作为循环。虽然有效,但我相信有一种比我的更好的方法: 代码 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'

我有一些代码可以工作,数据从一个文本文件中读取,作为一个dict列表,代码从每个dict中获取键和值作为循环。虽然有效,但我相信有一种比我的更好的方法:

代码

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%")

您可以使用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%")

我建议使用
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

关于我建议使用
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

关于

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()]

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()]
基本(和最佳)解决方案,无需任何额外库:

clk=[]
av_50=[]
av_100=[]
对于数据列表中的项目:
clk.追加(项目['clk'])
av_50.附加(项目['50%'))
av_100.附加(项目['100%'))
打印(时钟)
打印(AVU 50)
打印(AVU 100)
更优雅的列表理解解决方案,但效率较低,因为它需要对数据列表进行三次迭代,而不是以前的方法只需要一次

clk=[]
av_50=[]
av_100=[]
clk=[数据列表中项目的项目['clk']
av_50=[数据列表中项目的项目['50%”]
av_100=[数据_列表中项目的项目['100%”]
打印(时钟)
打印(AVU 50)
打印(AVU 100)
基本(和最佳)解决方案,无需任何额外库:

clk=[]
av_50=[]
av_100=[]
对于数据列表中的项目:
clk.追加(项目['clk'])
av_50.附加(项目['50%'))
av_100.附加(项目['100%'))
打印(时钟)
打印(AVU 50)
打印(AVU 100)
更优雅的列表理解解决方案,但效率较低,因为它需要对数据列表进行三次迭代,而不是以前的方法只需要一次

clk=[]
av_50=[]
av_100=[]
clk=[数据列表中项目的项目['clk']
av_50=[数据列表中项目的项目['50%”]
av_100=[数据_列表中项目的项目['100%”]
打印(时钟)
打印(AVU 50)
打印(AVU 100)

使用动态数据收集可能会很方便,以防您的dict结构会随着时间的推移而改变。这将适用于您的
数据\u列表

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)
然后
打印(按键)
输出

['Clk', '50%', '100%'`]
打印(值)


使用动态数据收集可能会很方便,以防您的dict结构可能会随着时间的推移而改变。这将适用于您的
数据\u列表

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)
然后
打印(按键)
输出

['Clk', '50%', '100%'`]
打印(值)


您可以使用列表理解,但它不会有效,因为它会对列表进行三次迭代,而不是当前解决方案。您可以使用列表理解,但它不会有效,因为它会对列表进行三次迭代,而不是当前解决方案。好的一行程序总是让我高兴,好的一行程序,没有看到如何组合这三个:)在本例中,您能告诉我如何查找*的功能吗?*运算符将迭代器解包到zip()函数的各个参数中。有关解包的更多详细信息,请参见此处:啊,这很有意义!非常感谢,我以后会用到:)你是让我的OneLiner更高效的英雄:)好的OneLiner总是让我快乐,好的OneLiner,没有看到如何组合这三个:)在本例中,您能告诉我如何查找*的功能吗?*运算符将迭代器解包到zip()函数的各个参数中。有关解包的更多详细信息,请参见此处:啊,这很有意义!非常感谢,我以后会用到:)你是让我的OneLiner更高效的英雄:)