简体   繁体   中英

Making python dictionary from a text file with multiple keys

I have a text file named file.txt with some numbers like the following :

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

I want to build a python dictionary, where the first number in each row is the key, the second number is always ignored, and the last three numbers are put as values. But in a dictionary, a key can not be repeated, so when I write my code (attached at the end of the question), what I get is

'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' ]

All the other numbers are removed, and only the last row is kept as the values. What I need is to have all the numbers against a key, say 1, to be appended in the dictionary. For example, what I need is :

'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']

Is it possible to do it elegantly in python? The code I have right now is the following :

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)}

You can use a 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:])

Try this:

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)

This is a solution for Python 3, because the statement a, *b = tuple1 is invalid in Python 2. Look at the solution of @cha0site if you are using Python 2.

Make the value of each key in diction be a list and extend that list with each iteration. With your code as it is written now when you say diction[pa[0]] = pa[1:] you're overwriting the value in diction[pa[0]] each time the key appears, which describes the behavior you're seeing.

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:]

In this code each value of diction will be a list. In each iteration if the key exists that list will be extended with new values from pa giving you a list of all the values for each key.

To do this in a very simple for loop:

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

Or, if you wanted to use defaultdict in a one liner-ish:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM