具有多个键的单个for循环的值的多个字典列表

时间:2019-05-20 15:47:23

标签: python python-3.x dictionary list-comprehension

我想用Python3中的一个for循环创建一个包含多个键值列表的字典。对我来说,时间执行和内存占用至关重要,因为我的Python3脚本正在读取的文件相当长。

我已经尝试了以下简单脚本:

p_avg = []
p_y = []
m_avg = []
m_y = []
res_dict = {}

with open('/home/user/test', 'r') as f:
    for line in f: 
        p_avg.append(float(line.split(" ")[5].split(":")[1]))
        p_y.append(float(line.split(" ")[6].split(":")[1]))
        m_avg.append(float(line.split(" ")[1].split(":")[1]))
        m_avg.append(float(line.split(" ")[2].split(":")[1]))

res_dict['p_avg'] = p_avg
res_dict['p_y'] = p_y
res_dict['m_avg'] = m_avg
res_dict['m_y'] = mse_y

print(res_dict)

我的home/user/test文件的格式为:

n:1 m_avg:7588.39 m_y:11289.73 m_u:147.92 m_v:223.53 p_avg:9.33 p_y:7.60 p_u:26.43 p_v:24.64
n:2 m_avg:7587.60 m_y:11288.54 m_u:147.92 m_v:223.53 p_avg:9.33 p_y:7.60 p_u:26.43 p_v:24.64
n:3 m_avg:7598.56 m_y:11304.50 m_u:148.01 m_v:225.33 p_avg:9.32 p_y:7.60 p_u:26.43 p_v:24.60
.
.
.

上面显示的Python脚本有效,但首先它太长且重复,第二,我不确定它的效率如何。我最终想用列表理解来创建相同的东西。像这样:

(res_dict['p_avg'], res_dict['p_y']) = [(float(line.split(" ")[5].split(":")[1]), float(line.split(" ")[6].split(":")[1])) for line in f]

但是对于所有四个字典键。您是否认为使用列表理解可以减少脚本的已用内存占用量和执行速度?列表理解的正确语法应该是什么?

[EDIT]我已经更改了dict-> res_dict,因为有人提到这不是一个好习惯,我还修正了一个错字,其中p_y不是' t指向正确的值,并添加了一条打印语句以打印其他用户提到的结果字典。

3 个答案:

答案 0 :(得分:2)

您可以使用defaultdict。无需每次都拆分行,并且为了使其更具可读性,您可以使用lambda提取每个项目的字段。

from collections import defaultdict

res = defaultdict(list)

with open('/home/user/test', 'r') as f:
    for line in f: 
        items = line.split()
        extract = lambda x: x.split(':')[1]

        res['p_avg'].append(extract(items[5]))
        res['p_y'].append(extract(items[6]))
        res['m_avg'].append(extract(items[1]))
        res['m_y'].append(extract(items[2]))

答案 1 :(得分:1)

您可以初始化dict以包含字符串/列表对,然后在遍历每一行时直接附加。另外,您也不想在每次迭代中继续在split()上调用line。相反,只需调用一次并保存到本地变量和该变量的索引即可。

# Initialize dict to contain string key and list value pairs
dictionary = {'p_avg':[],
              'p_y':[],
              'm_avg':[],
              'm_y':[]
             }
with open('/home/user/test', 'r') as f:
    for line in f:
        items = line.split() # store line.split() so you don't split multiple times per line
        dictionary['p_avg'].append(float(items[5].split(':')[1]))
        dictionary['p_y'].append(float(items[6].split(':')[1])) # I think you meant index 6 here
        dictionary['m_avg'].append(float(items[1].split(':')[1]))
        dictionary['m_y'].append(float(items[2].split(':')[1]))

答案 2 :(得分:1)

您可以预定义dict属性:

d = {
    'p_avg': [],
    'p_y': [],
    'm_avg': [],
    'm_y': []
}

,然后直接附加到它们:

with open('/home/user/test', 'r') as f:
    for line in f:
        splitted_line = line.split(" ")
        d['p_avg'].append(float(splitted_line[5].split(":")[1]))
        d['p_y'].append(float(splitted_line[5].split(":")[1]))
        d['m_avg'].append(float(splitted_line[1].split(":")[1]))
        d['m_avg'].append(float(splitted_line[2].split(":")[1]))

P.S。切勿使用等于内置词的变量名,例如dictlist等。它会导致很多错误!