Столкнулся с проблемой при записи новых данных в список из словарей.
При прогоне цикла через обычное копирование получалось что-то такое:
[{Ингредиент: Молоко, Количество: 500, Ед: г}]
[{Ингредиент: Яйца, Количество: 500, Ед: г}, {Ингредиент: Яйца, Количество: 500, Ед: г}]
[{Ингредиент: Творог, Количество: 500, Ед: г}, {Ингредиент: Творог, Количество: 500, Ед: г}, {Ингредиент: Творог, Количество: 500, Ед: г}]
etc
Конструкция ingredient[‘measure’] = ingredient_info[2] оказалось, что меняет по всем списке ingredient_list, содержащем словари, значения по ключу ‘measure’.
Решить проблему удалось через полное копирование списка ingredient в список «а» через a = copy.deepcopy(ingredient). Функция находится в библиотеке copy, которую надо импортировать.
import copy
def cook_book_collector(file_path):
cook_book = {}
with open(file_path) as menu:
for line in menu: # проходимся по строкам
dish = line.strip() # 1 строка = название блюда
ingredient = {} # словарь для информации по ингредиенту
ingredient_list = [] # список ингредиентов
for ing_number in range(1, int(menu.readline().strip())+1): # запускаем цикл от 1 до N ингредиентов
ingredient_info = menu.readline().strip() # читаем строку, затем разбиваем ее на список, затем заполняем словарь ингредиентов
ingredient_info = ingredient_info.split(' | ')
ingredient['ingridient_name'] = ingredient_info[0]
ingredient['quantity'] = ingredient_info[1]
ingredient['measure'] = ingredient_info[2]
a = copy.deepcopy(ingredient) # копируем словарь в новую переменную, чтобы на строках выше потом не переписались все данные
ingredient_list.append(a) # добавляем в конец списка инфу по каждому новому ингредиенту
cook_book[dish] = ingredient_list
menu.readline()
return cook_book