Лучший способ создавать вложенные словари? - PullRequest
1 голос
/ 12 июля 2020

Я проверяю, верны ли некоторые операторы if и записывают ли они результаты во вложенный словарь. Например:

alex_age = 9
jim_age = 10
alex_fav_sport = "soccer"
jim_fav_sport = "b-ball"
jose_fav_animal = "dog"
jessie_fav_anmial = "zebra"
students_total = 75

out = {}
if alex_age != jim_age: 
    out['school'] = {}
    out['school']['students_data'] = {}
    out['school']['students_data']['4th Grade'] = {}
    out['school']['students_data']['4th Grade']['Student'] = {} 
    out['school']['students_data']['4th Grade']['Student']['Alex L'] = {}
    out['school']['students_data']['4th Grade']['Student']['Alex L']['age'] = {}
    out['school']['students_data']['4th Grade']['Student']['Alex L']['age'] = alex_age 

if alex_fav_sport != jim_fav_sport: 
    out['school'] = {}
    out['school']['students_data'] = {}
    out['school']['students_data']['4th Grade'] = {}
    out['school']['students_data']['4th Grade']['Student'] = {} 
    out['school']['students_data']['4th Grade']['Student']['Alex L']['Fav Sport'] = {}
    out['school']['students_data']['4th Grade']['Student']['Alex L']['Fav Sport'] = alex_fav_sport 

if students_total > 35: 
    out['school'] = {}
    out['school']['students_data'] = {}
    out['school']['students_data']['Total Students In School'] = {}
    out['school']['students_data']['Total Students In School'] = students_total 

if jose_fav_animal != jessie_fav_animal: 
    out['school'] = {}
    out['school']['students_data'] = {}
    out['school']['students_data']['2nd Grade'] = {}
    out['school']['students_data']['2nd Grade']['Student'] = {} 
    out['school']['students_data']['2nd Grade']['Student']['Jose F'] = {}
    out['school']['students_data']['2nd Grade']['Student']['Jose F']['Fav Animal'] = jose_fav_animal

Как мне написать функцию, которая будет создавать гнезда на основе моих желаемых входных данных?

1 Ответ

0 голосов
/ 12 июля 2020

У вас может быть такая вспомогательная функция:

out = {}
def create(*args):
    d = out
    for arg in args:
         d = d.setdefault(arg, {})

create('school', 'students_data', '4th Grade', 'Student', 'Alex L', 'age')
create('school', 'students_data', '4th Grade', 'Student', 'Alex L', 'Fav Sport')

Или она может принимать аргументы только по ключевым словам для последнего ключа, пара значений:

def create(*args, k, v):
    d = out
    for arg in args:
         d = d.setdefault(arg, {})
    d[k] = v

create('school', 'students_data', '4th Grade', 'Student', 'Alex L', k='age', v=alex_age)
create('school', 'students_data', '4th Grade', 'Student', 'Alex L', k='Fav Sport', v="soccer")

В качестве альтернативы вы можно использовать вложенный словарь по умолчанию:

from collections import defaultdict

def rec_dd():
    return defaultdict(rec_dd)

out = rec_dd()
out['school']['students_data']['4th Grade']['Student']['Alex L']['age'] = alex_age
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...