How can I fix my code to create a nested dictionary?

I am trying to create a nested dictionary. I have a list of tuples (called "kinetic_parameters") that looks like this:

('New Model','v7','k1',0.1)
('New Model','v8','k2',0.2)
('New Model','v8','k3',0.3)

I need the second column to be a foreign key, and the value to be another dictionary with the internal key being the third column, and the value to be the number in the fourth.

I currently have:

    for i in kinetic_parameters:
        dict[i[1]]={}
        dict[i[1]][i[2]]=i[3]

But this code will not process multiple keys in the internal dictionary, so I am losing some information. Does anyone know how to fix my problem?

I am using Python 2.7 and I want the result to look like this:

{'v7': {'k1': 0.1}, 'v8':{'k2':0.2, 'k3': 0.3}}
+4
source share
6 answers

. ,

for i in kinetic_parameters:
        d[i[1]]={}
for i in kinetic_parameters:
        d[i[1]][i[2]]=i[3]

for i in kinetic_parameters:
        if d.get(i[1]) is None:
            d[i[1]]={}
        d[i[1]][i[2]]=i[3]
+1

defaultdict dict , , :

import collections
d = collections.defaultdict(dict)
for i in kinetic_parameters:
    d[i[1]][i[2]]=i[3]

.

+3

, ( "" ) , . -: , , . , :

nested = dict()
for row in kinetic_parameters:
    _model, outkey, inkey, val = row
    if outkey not in d:
        nested[outkey] = dict()  
    nested[outkey][inkey] = val

defaultdict, dicts:

from collections import defaultdict
nested = defaultdict(dict)
for row in kinetic_parameters:
    _model, outkey, inkey, val = row
    nested[outkey][inkey] = val
+2

dict , reduce :

>>> l=[('New Model','v7','k1',0.1),
... ('New Model','v8','k2',0.2),
... ('New Model','v8','k3',0.3)]
>>> 
>>> [reduce(lambda x,y:{y:x},p) for p in [i[1:][::-1] for i in l]]
[{'v7': {'k1': 0.1}}, 
 {'v8': {'k2': 0.2}}, 
 {'v8': {'k3': 0.3}}]

:

>>> l=[('New Model','v7','k1',0.1,'c','5','r',9),
...  ('New Model','v8','k2',0.2,'d','6'),
...  ('New Model','v8','k3',0.3)]

>>> [reduce(lambda x,y:{y:x},p) for p in [i[1:][::-1] for i in l]]
[{'v7': {'k1': {0.1: {'c': {'5': {'r': 9}}}}}}, 
 {'v8': {'k2': {0.2: {'d': '6'}}}}, 
 {'v8': {'k3': 0.3}}]

: , - dict, :

>>> g=[reduce(lambda x,y:{y:x},p) for p in [i[1:][::-1] for i in l]]
>>> dict(next(i.iteritems()) for i in g)
{'v8': {'k3': 0.3}, 'v7': {'k1': {0.1: {'c': {'5': {'r': 9}}}}}}
+1
kinetic_parameters = [('New Model','v7','k1',0.1),
                      ('New Model','v8','k2',0.2),
                      ('New Model','v8','k3',0.3)
                    ]

d = {}
for i in kinetic_parameters:
    if i[1] not in d.keys(): # Check if v7, v8 etc is present.
        d[i[1]] = {}         # Create an empty dict if absent
    d[i[1]][i[2]] = i[3]
print(d)

- , :

{'v7': {'k1': 0.1}, 'v8': {'k3': 0.3, 'k2': 0.2}}
+1

, , , :

import collections

kinetic_parameters = [
    ('New Model','v7','k1',0.1),
    ('New Model','v8','k2',0.2),
    ('New Model','v8','k3',0.3),
]

result = collections.defaultdict(dict)
for _, outter_key, inner_key, inner_value in kinetic_parameters:
    outter_value = {inner_key: inner_value}
    result[outter_key].update(outter_value)

defaultdict . , result[outter_key], . ( ).

Update

defaultdict:

result = {}
for _, outter_key, inner_key, inner_value in kinetic_parameters:
    outter_value = {inner_key: inner_value}
    result.setdefault(outter_key, {})
    result[outter_key].update(outter_value)

setdefault .

+1

All Articles