Объединение двух словарей без перезаписи значений во вложенном

#python #dictionary #nested #mergeddictionaries

#python #словарь #вложенный #mergeddictionaries

Вопрос:

Я пытался обновлять основной словарь каждым новым в цикле, но каждый раз он перезаписывал значения внутри вложенного словаря. Я имею в виду, что я хочу что-то вроде этого:

 {'Barbour': {1900: 73041, 1910: 895427, 1920: 1531624, 1930: 1617086, 1940: 1420561, 1950: 1853223, 
             1960: 3092728, 1970: 3505193, 1980: 3659797, 1990: 2575561, 2000: 743757, 2010: 1730711}, 
'Berkeley': {1900: 0, 1910: 0, 1920: 0, 1930: 0, 1940: 0, 1950: 0, 1960: 0, 1970: 0, 1980: 0, 1990: 
          0, 2000: 0, 2010: 0}} 
  

(для всех городов)

 def read_file_contents_coal():
    return ['Barbour,73041,895427,1531624,1617086,1420561,1853223,3092728,3505193,3659797,2575561,743757,1730711n',
            'Berkeley,0,0,0,0,0,0,0,0,0,0,0,0n',
            'Boone,0,50566,1477560,3045056,3804527,5851267,6278609,11607216,13842525,27618152,32446186,23277998n',
            'Braxton,0,114422,286955,123991,13751,38414,218087,0,459517,3256906,1196489,439662n',
            ]

def process_file_contents():
    lst = read_file_contents_coal()
    dic = {}
    coal_dic = {}
    yearcoaldic = {}
    ycdic = {}
    for stringdata in lst:
        city_data = stringdata.strip().split(',')
        year = 1900
        for j in range(1, 13):
            ycdic = {year: int(city_data[j])}
            year  = 10
            yearcoaldic.update(ycdic)
        dic = {city_data[0]: yearcoaldic}

    coal_dic.update(dic)
    print(coal_dic)
    return coal_dic
  

Ответ №1:

[РЕДАКТИРОВАТЬ]: проблема в том, что вам нужно перейти yearcoaldic к первому циклу и всегда устанавливать для него значение en empty dictionary, иначе вы всегда будете перезаписывать свои значения так, как вы испытали.

 def process_file_contents():
    lst = read_file_contents_coal()
    dic = {}
    coal_dic = {}
    ycdic = {}
    for stringdata in lst:
        yearcoaldic = {}
        city_data = stringdata.strip().split(',')
        year = 1900
        for j in range(1, 13):
            ycdic = {year: int(city_data[j])}
            year  = 10
            yearcoaldic.update(ycdic)
        # dic = {city_data[0]: yearcoaldic}
        dic[city_data[0]] = yearcoaldic

    # coal_dic.update(dic)
    # print(coal_dic)
    return dic
  

Комментарии:

1. Когда я пробовал так, каждый город получал значения последнего добавленного города ;/ Это та же проблема, что и у меня с моим предыдущим кодом. В любом случае спасибо за помощь <3 <3

2. Я имею в виду, что в конце, при выполнении программ, каждый город получал вложенный словарь с годами ofc, и эти годы получали одинаковые значения для каждого города, одинаковые значения для последнего добавленного мной города. Каждый город получил это начало {1900: 0, 1910: 0, 1920: 1270782,

3. Мой плохой, исправляя проблему, вы всегда инициализируете yearcoaldic пустой словарь, иначе вы всегда будете переписывать его так, как вы испытали

4. О да, отлично работает, как я хочу <3 большое спасибо <3 Хорошего дня!