numpy 从带有多个键的文本文件中创建Python字典

thtygnil  于 2023-10-19  发布在  Python
关注(0)|答案(4)|浏览(103)

我有一个名为file.txt的文本文件,其中包含如下数字:
我想构建一个python字典,其中每行的第一个数字是键,第二个数字总是被忽略,最后三个数字作为值。但是在字典中,一个键是不能重复的,所以当我写我的代码时(附在问题的最后),我得到的是

'1' : [ '90'  '4.914E-08'  '1.563E-07'  '5.193E-07' ]
'2' : [ '5'   '5.254E-07'  '0.166E-02'  '9.723E-06' ]
'3' : [ '24'  '3.244E-03'  '5.239E-04'  '9.002E-08' ]

所有其他数字都被删除,只有最后一行保留为值。我需要的是把所有的数字都加到一个键上,比如说1,然后把它附加到字典里。例如,我需要的是:

'1' : ['8.106E-08'  '2.052E-08'  '3.837E-08' '-4.766E-09'  '9.003E-08'  '4.812E-07' '4.914E-08'  '1.563E-07' '5.193E-07']

有没有可能在python中优雅地完成它?我现在的代码如下:

diction = {}

with open("file.txt") as f:
    for line in f:
        pa = line.split()
        diction[pa[0]] = pa[1:]

with open('file.txt') as f:
    diction = {pa[0]: pa[1:] for pa in map(str.split, f)}
2sbarzqh

2sbarzqh1#

可以使用defaultdict

from collections import defaultdict
data = defaultdict(list)
with open("file.txt", "r") as f:
    for line in f:
        line = line.split()
        data[line[0]].extend(line[2:])
dluptydi

dluptydi2#

试试这个:

from collections import defaultdict

diction = defaultdict(list)

with open("file.txt") as f:
    for line in f:
        key, _, *values = line.strip().split()
        diction[key].extend(values)

print(diction)

这是Python 3的解决方案,因为a, *b = tuple1语句在Python 2中是无效的。如果你使用的是Python 2,请看@cha0site的解决方案。

1bqhqjot

1bqhqjot3#

diction中每个键的值设为一个列表,并在每次迭代中扩展该列表。使用您现在编写的代码,当您说diction[pa[0]] = pa[1:]时,您每次出现键时都将diction[pa[0]]中的值替换为diction[pa[0]],这描述了您看到的行为。

with open("file.txt") as f:
    for line in f:
        pa = line.split()
        try:
            diction[pa[0]].extend(pa[1:])
        except KeyError:
            diction[pa[0]] = pa[1:]

在这段代码中,diction的每个值都是一个列表。在每次迭代中,如果键存在,则该列表将使用来自pa的新值进行扩展,从而为您提供每个键的所有值的列表。

edqdpe6u

edqdpe6u4#

在一个非常简单的for循环中做到这一点:

with open('file.txt') as f:
    return_dict = {}
    for item_list in map(str.split, f):
        if item_list[0] not in return_dict:
            return_dict[item_list[0]] = []
        return_dict[item_list[0]].extend(item_list[1:]) 
     return return_dict

或者,如果你想在一行代码中使用defaultdict:

from collections import defaultdict
with open('file.txt') as f:
    return_dict = defaultdict(list)

    [return_dict[item_list[0]].extend(item_list[1:]) for item_list in map(str.split, f)]

    return return_dict

相关问题