Столкнулся с проблемой при записи новых данных в список из словарей.
При прогоне цикла через обычное копирование получалось что-то такое:
[{Ингредиент: Молоко, Количество: 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