使用多个键从文本文件制作python字典

时间:2018-08-16 12:12:43

标签: python numpy dictionary

我有一个名为file.txt的文本文件,上面有一些数字,如下所示:

1 79  8.106E-08  2.052E-08  3.837E-08
1 80 -4.766E-09  9.003E-08  4.812E-07
1 90  4.914E-08  1.563E-07  5.193E-07
2 2   9.254E-07  5.166E-06  9.723E-06
2 3   1.366E-06 -5.184E-06  7.580E-06
2 4   2.966E-06  5.979E-07  9.702E-08
2 5   5.254E-07  0.166E-02  9.723E-06
3 23  1.366E-06 -5.184E-03  7.580E-06
3 24  3.244E-03  5.239E-04  9.002E-08

我想构建一个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)}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

尝试一下:

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的解决方案。

答案 2 :(得分:0)

使diction中每个键的值成为列表,并在每次迭代时扩展该列表。使用现在编写的代码,每次说出diction[pa[0]] = pa[1:]时,每次出现键时,都会覆盖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中的新值扩展该列表,从而为您提供每个键的所有值的列表。

答案 3 :(得分:0)

要在一个非常简单的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