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

Python 具有多个键的单个for循环的多字典值分配列表,python,python-3.x,dictionary,list-comprehension,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("

我想在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)
我的主页/用户/测试文件的格式为:

n:1平均值:7588.39平均值:11289.73平均值:147.92平均值:223.53平均值:9.33平均值:7.60平均值:26.43平均值:24.64 n:2 m_平均值:7587.60 m_y:11288.54 m_u:147.92 m_v:223.53 p_平均值:9.33 p_y:7.60 p_u:26.43 p_v:24.64 n:3百万平均值:7598.56百万年:11304.50百万年:148.01百万年:225.33百万平均值:9.32百万年:7.60百万年:26.43百万年: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]
但对于所有四个字典键。您认为使用列表理解可以减少脚本的内存占用和执行速度吗?列表理解的正确语法应该是什么

[编辑]我更改了dict->res_dict,因为有人提到这不是一个好的做法,我还修复了一个拼写错误,其中p_y没有指向正确的值,并添加了一个print语句来打印其他用户提到的结果字典。

您可以初始化dict以包含字符串/列表对,然后在遍历每一行时直接追加。另外,您不希望在每次迭代中都在线调用split。相反,只需调用一次并保存到一个局部变量,然后从该变量建立索引

# 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]))
您可以使用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]))

您可以预先定义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]))

注意:永远不要使用与内置单词相同的变量名,如dict、list等。它可能会导致许多不同的错误

请添加示例输入,并检查问题中的缩进。此外,我没有看到打印或任何东西,所以idk你如何得到你的输出。请也解决这个问题。问题中的代码不会执行,因为没有定义mse_y变量。你也不应该给变量起与dict一样的内置名称。一个相当明显的优化方法是不将同一行拆分4次,但看起来你自己根本没有做任何优化。我还建议您在尝试优化脚本之前对其进行概要分析,以查看它在哪里花费了大部分执行时间。看,是的,你对dict名称的看法是正确的,是的,我指的是索引6。我简化了我的程序并输入了一个错误。我同意分割行最初是有意义的,但是不可能用一行指定所有键的值吗