Помогите решить задачку.
У меня есть файл с данными:
Омлет
3
Яйцо | 2 | шт
Молоко | 100 | мл
Помидор | 2 | шт
Утка по-пекински
4
Утка | 1 | шт
Вода | 2 | л
Мед | 3 | ст.л
Соевый соус | 60 | мл
Запеченный картофель
3
Картофель | 1 | кг
Чеснок | 3 | зубч
Сыр гауда | 100 | г
Фахитос
5
Говядина | 500 | г
Перец сладкий | 1 | шт
Лаваш | 2 | шт
Винный уксус | 1 | ст.л
Помидор | 2 | шт
Его нужно привести к:
cook_book = {
'Омлет': [
{'ingridient_name': 'Яйцо', 'quantity': 2, 'measure': 'шт.'},
{'ingridient_name': 'Молоко', 'quantity': 100, 'measure': 'мл'},
{'ingridient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}
],
'Утка по-пекински': [
{'ingridient_name': 'Утка', 'quantity': 1, 'measure': 'шт'},
{'ingridient_name': 'Вода', 'quantity': 2, 'measure': 'л'},
{'ingridient_name': 'Мед', 'quantity': 3, 'measure': 'ст.л'},
{'ingridient_name': 'Соевый соус', 'quantity': 60, 'measure': 'мл'}
],
'Запеченный картофель': [
{'ingridient_name': 'Картофель', 'quantity': 1, 'measure': 'кг'},
{'ingridient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'},
{'ingridient_name': 'Сыр гауда', 'quantity': 100, 'measure': 'г'},
]
}
Мой код:
cook_book_dict = dict()
cook_book_ingredients_list = list()
with open('dishes_list.txt', encoding="utf - 8") as f:
for line in f:
del cook_book_ingredients_list[:]
dish_name = line.strip()
s = int(f.readline().strip())
while s != 0:
string = f.readline().strip()
line_ingr= string.split("|")
cook_book_ingredients_list.append({''[{'ingridient_name': line_ingr[0].strip(), 'quantity': line_ingr[1].strip(),'measure': line_ingr[2].strip()}]})
print(cook_book_ingredients_list)
Выдает ошибку:
TypeError: string indices must be integers
У меня это слабая тема, не могу никак разобраться(
Ответ
import json
keys = ['ingridient_name', 'quantity', 'measure', ]
with open('dishes_list.txt') as text:
lines = filter(bool, map(str.strip, text))
cook_book_dict = {n: [{k: v for (k, v) in zip(keys, map(str.strip, next(lines).split(' | ', 2)))}
for _ in range(int(next(lines)))] for n in lines}
print(json.dumps(cook_book_dict, indent=2, ensure_ascii=False))
особо не знаю что тут пояснять, просто разверну
import json
keys = ['ingridient_name', 'quantity', 'measure', ]
cook_book_dict = {}
with open('dishes_list.txt') as text:
# только непустые линии
lines = []
for line in text:
line = line.strip()
if line:
lines.append(line)
continue
lines = iter(lines) # https://docs.python.org/3/library/functions.html#iter
# далее выталкиваем текст из iter
for name in lines: # шаг_1 - вытолкнутая тут линия - всегда блюдо
cook_book_dict[name] = []
num = next(lines) # шаг_2 - следующая за блюдом - всегда номер
for _ in range(int(num)): # шаг_3 - затем надо вытолкнуть из iter - num линий состава блюда
sostav_line = next(lines) # одна из линий состава
ingrid = sostav_line.split(' | ') # разбить на ингридиенты
z = zip(keys, ingrid) # сопоставить ключ - https://docs.python.org/3/library/functions.html#zip
sostav_dict = {k: v for (k, v) in z} # генератор словаря ингридиентов
cook_book_dict[name].append(sostav_dict)
continue
# тк все линии не пустые, и мы вытолкнули все линии текущего юляда, следующая лиция опять будет - блюдо
continue
print(json.dumps(cook_book_dict, indent=2, ensure_ascii=False))
Комментариев нет:
Отправить комментарий