140 lines
5.6 KiB
Python
140 lines
5.6 KiB
Python
import json
|
|
from collections import defaultdict
|
|
|
|
# JSON wygenerowany przez AI
|
|
json_data = """
|
|
{
|
|
"1. Śniadanie": [
|
|
{"item": "mleko", "qty": 210, "unit": "g"},
|
|
{"item": "masło", "qty": 120, "unit": "g"},
|
|
{"item": "drożdże", "qty": 15, "unit": "g"},
|
|
{"item": "cukru", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "mąki pszennej", "qty": 450, "unit": "g"},
|
|
{"item": "sol", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "ziarna", "qty": 6, "unit": "łyżek"},
|
|
{"item": "jajko", "qty": 1, "unit": "szt."},
|
|
{"item": "koper", "qty": 6, "unit": "gałązek"},
|
|
{"item": "sałata lodowa", "qty": 4, "unit": "liści"},
|
|
{"item": "łosoś", "qty": 300, "unit": "g"},
|
|
{"item": "ogórki", "qty": 100, "unit": "g"},
|
|
{"item": "rzodkiewki", "qty": 80, "unit": "g"},
|
|
{"item": "awokado", "qty": 1, "unit": "szt."},
|
|
{"item": "ser kremowy", "qty": 100, "unit": "g"},
|
|
{"item": "szczypiorek", "qty": 2, "unit": "łyżek"},
|
|
{"item": "sól", "qty": 0.25, "unit": "łyżeczki"},
|
|
{"item": "pieprz", "qty": 2, "unit": "szczypty"}
|
|
],
|
|
"2. II Śniadanie": [
|
|
{"item": "koperek włoski", "qty": 2, "unit": "łyżeczki"},
|
|
{"item": "płatki chili", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "ser parmezan", "qty": 100, "unit": "g"},
|
|
{"item": "mąka pszenna", "qty": 150, "unit": "g"},
|
|
{"item": "masło", "qty": 100, "unit": "g"},
|
|
{"item": "żółtko", "qty": 1, "unit": "szt."},
|
|
{"item": "sól", "qty": 2, "unit": "szczypty"},
|
|
{"item": "jajko", "qty": 1, "unit": "szt."},
|
|
{"item": "sól morska", "qty": 0, "unit": "g"}
|
|
],
|
|
"3. Obiad": [
|
|
{"item": "orzeszki piniowe", "qty": 50, "unit": "g"},
|
|
{"item": "migdały", "qty": 50, "unit": "g"},
|
|
{"item": "oliwa z oliwek", "qty": 40, "unit": "g"},
|
|
{"item": "mięso mielone", "qty": 300, "unit": "g"},
|
|
{"item": "cynamon", "qty": 0.25, "unit": "łyżeczki"},
|
|
{"item": "gałka muszkatołowa", "qty": 0.25, "unit": "łyżeczki"},
|
|
{"item": "sól", "qty": 0.5, "unit": "łyżeczki"},
|
|
{"item": "pieprz", "qty": 0.25, "unit": "łyżeczki"},
|
|
{"item": "rodzynki", "qty": 80, "unit": "g"},
|
|
{"item": "śliwki suszone", "qty": 80, "unit": "g"},
|
|
{"item": "bułka tartą", "qty": 30, "unit": "g"},
|
|
{"item": "jajka", "qty": 2, "unit": "szt."},
|
|
{"item": "tuszka kurczaka", "qty": 1, "unit": "szt."},
|
|
{"item": "sól", "qty": 1.5, "unit": "łyżeczki"},
|
|
{"item": "pieprz", "qty": 0.5, "unit": "łyżeczki"},
|
|
{"item": "papryka słodka", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "oregano", "qty": 2, "unit": "łyżeczki"},
|
|
{"item": "cebula", "qty": 300, "unit": "g"},
|
|
{"item": "masło", "qty": 40, "unit": "g"},
|
|
{"item": "oliwa z oliwek", "qty": 20, "unit": "g"},
|
|
{"item": "wino białe", "qty": 360, "unit": "g"},
|
|
{"item": "woda", "qty": 200, "unit": "g"},
|
|
{"item": "sól", "qty": 0.5, "unit": "łyżeczki"},
|
|
{"item": "cukier", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "oliwa z oliwek", "qty": 0, "unit": "g"}
|
|
],
|
|
"4. Podwieczorek": [
|
|
{"item": "rzodkiewki", "qty": 1, "unit": "pęczek"},
|
|
{"item": "sól", "qty": 5, "unit": "szczypt"},
|
|
{"item": "śmietana", "qty": 200, "unit": "g"},
|
|
{"item": "mleko", "qty": 120, "unit": "g"},
|
|
{"item": "koncentrat bulionu", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "pieprz", "qty": 2, "unit": "szczypty"},
|
|
{"item": "agar", "qty": 1, "unit": "płaska łyżeczka"},
|
|
{"item": "ser kozie", "qty": 100, "unit": "g"},
|
|
{"item": "jogurt grecki", "qty": 50, "unit": "g"}
|
|
],
|
|
"5. Kolacja": [
|
|
{"item": "rzodkiewki", "qty": 1, "unit": "pęczek"},
|
|
{"item": "sól", "qty": 5, "unit": "szczypt"},
|
|
{"item": "śmietana", "qty": 200, "unit": "g"},
|
|
{"item": "mleko", "qty": 120, "unit": "g"},
|
|
{"item": "koncentrat bulionu", "qty": 1, "unit": "łyżeczka"},
|
|
{"item": "pieprz", "qty": 2, "unit": "szczypty"},
|
|
{"item": "agar", "qty": 1, "unit": "płaska łyżeczka"},
|
|
{"item": "ser kozie", "qty": 100, "unit": "g"},
|
|
{"item": "jogurt grecki", "qty": 50, "unit": "g"}
|
|
]
|
|
}
|
|
"""
|
|
|
|
def normalize_unit(u):
|
|
u = u.lower().strip().replace(".", "")
|
|
if "ząb" in u: return "ząbek"
|
|
if "łyżeczk" in u: return "łyżeczka"
|
|
if "łyżk" in u: return "łyżka"
|
|
if u in ["szt", "sztuka", "sztuki"]: return "szt"
|
|
if u in ["g", "gram", "gramów"]: return "g"
|
|
return u
|
|
|
|
def normalize_name(n):
|
|
n = n.lower().strip()
|
|
# Mapowanie liczby mnogiej na pojedynczą (synonimy)
|
|
synonyms = {
|
|
"jajka": "jajko",
|
|
"ziemniaki": "ziemniak",
|
|
"ząbki czosnku": "czosnek",
|
|
"ząbek czosnku": "czosnek",
|
|
"filety z piersi kurczaka": "filet z piersi kurczaka"
|
|
}
|
|
return synonyms.get(n, n)
|
|
|
|
data = json.loads(json_data)
|
|
shopping_list = defaultdict(lambda: defaultdict(float))
|
|
|
|
for meal_name, ingredients in data.items():
|
|
for item in ingredients:
|
|
name = normalize_name(item['item'])
|
|
unit = normalize_unit(item['unit'])
|
|
qty = item['qty']
|
|
shopping_list[name][unit] += qty
|
|
|
|
|
|
# Wyświetlanie jako lista Markdown do odhaczenia
|
|
print("## Lista Zakupów\n")
|
|
|
|
for product, units in sorted(shopping_list.items()):
|
|
details = []
|
|
for unit, total in units.items():
|
|
if total == 0:
|
|
# Obsługa produktów bez konkretnej ilości (np. "do natłuszczenia")
|
|
details.append(f"wg uznania ({unit})")
|
|
else:
|
|
# Formatowanie liczby: usuwamy .0 jeśli to liczba całkowita
|
|
qty_str = f"{int(total)}" if total.is_integer() else f"{round(total, 2)}"
|
|
details.append(f"{qty_str} {unit}")
|
|
|
|
# Formatowanie linii Markdown: - [ ] Produkt: ilość, ilość
|
|
print(f"- [ ] **{product.capitalize()}**: {', '.join(details)}")
|
|
|
|
|