Как создать словарь в словаре в словаре значениями которого будут переменные?

Дела такие, не добавляется словарь в словарь в словарь, вместо него выводит {}.

pat = {}
facus = {}

with open('p.txt') as f:
    for l in f:
        n, FIO, fac, spis = l.strip().split(',')
        ll = spis.split(':')
        for i in ll:
            if i.isdigit() == True:
                facus.update({i : i-1})
        pat[n] = {'ФИО': FIO, 'Год рождения' : int(fac), 'Факультеты' : facus}
        facus.clear()
print(pat)

Входные данные:

1, Филатова София Михайловна, 5, История японской музыки:212:История Италии:213:Инициация и реализация социально-направленного стартапа:103:Идея христианского единства в русской мысли XIX в- начала XX в.:311:Вычислительная статистика:101

2, Ефимов Андрей Глебович, 1, История японской музыки:212

3, Логинов Егор Михайлович, 3, История Италии:213:Идея христианского единства в русской мысли XIX в- начала XX в.:311:Вычислительная статистика:101

4, Михайлова Полина Артемьевна, 2, Инициация и реализация социально-направленного стартапа:103:Вычислительная статистика:101

5, Иванова Агата Ярославовна, 1, История Италии:213

Спасибо всем кто прочитал и да пребудет с вами сила!


Ответы (2 шт):

Автор решения: S. Nick

Я не проверял вашу логику, потому что не понял что вы делаете.

Я просто исправил ошибки, которые получал при запуске и отметил для вас что я изменил.

main.py

import pprint                                                        # +++

pat = {}
facus = {}

# ---------------> vvv  vvvvvvvvvvvvvvvv <--------------------------------
with open('p.txt', 'r', encoding='utf-8') as f:
    for l in f:
        n, FIO, fac, spis = l.strip().split(',')
        #print(n, FIO, fac, spis)
        
        ll = spis.split(':')
        for i in ll:
            #print(f'\ti  = {i}; {i.isdigit()}; {type(i)}') #
            if i.isdigit():                                       # == True:

#                facus.update({i : i-1})
# ------------------------------> vvvvvv <------     i - это строка   <------
                facus.update({i : int(i)-1})

        pat[n] = {'ФИО': FIO, 'Год рождения' : int(fac), 'Факультеты' : facus}
        
        facus.clear()


pprint.pprint(pat)                                           # +++ pprint

p.txt

1, Филатова София Михайловна, 5, История японской музыки:212:История Италии:213:Инициация и реализация социально-направленного стартапа:103:Идея христианского единства в русской мысли XIX в- начала XX в.:311:Вычислительная статистика:101
2, Ефимов Андрей Глебович, 1, История японской музыки:212
3, Логинов Егор Михайлович, 3, История Италии:213:Идея христианского единства в русской мысли XIX в- начала XX в.:311:Вычислительная статистика:101
4, Михайлова Полина Артемьевна, 2, Инициация и реализация социально-направленного стартапа:103:Вычислительная статистика:101
5, Иванова Агата Ярославовна, 1, История Италии:213

введите сюда описание изображения

→ Ссылка
Автор решения: Xander

Вот, я починил:

pat = {}


with open('p.txt') as f:
    for l in f:
        n, FIO, fac, spis = l.strip().split(',')
        ll = spis.split(':')
        titles = ll[::2]
        numbers = ll[1::2]
        facus = dict(zip(numbers, titles))
        pat[n] = {'ФИО': FIO, 'Год рождения': int(fac), 'Факультеты': facus}

        # facus.clear()
        # ^^^^^^^^^^^^^   Эта строчка не нужна,
        # а то получается, что вы очищаете словарь, который только что добавили
        

print(pat)

При этом я вижу, что у вас в вашем примере входные данные выглядят так, как будто между строчками есть ещё пустые строчки. Если в реальных данных тоже так, то вам ещё нужно сделать так, чтобы код пропускал пустые строчки.

→ Ссылка