Meddelande
På gamla.pluggakuten.se kan du fortfarande läsa frågorna och svaren som ställts, men du kan inte skapa ett nytt konto eller nya trådar. Nya frågor och nytt konto skapar du på det nya forumet, välkommen dit!
Python: Val av produkt => pris
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Python: Val av produkt => pris
Hej på er,
Mycket kort fattat, vi har några produkter på jobbet som har olika pris. Jag försöker skriva ett program som kan printa ut priset, beroende på vad man har valt, ser ut som nedan:
# -*- coding: utf-8 -*-
a = {"name": "Modular",
"Serier":['72x', '82x', '92x'],
"Voltage": [208, 230, 400, 480],
"Price": [500, 600, 700]}
b = {"name": "CT",
"Serier": ['35x', '45x', '52x'],
"Voltage": [208, 230, 400, 480],
"Price": [200, 300, 400]}
modeler = [a, b]
for model in modeler:
print
print "Name: ", model["name"]
print "Serier: ", model["Serier"]
print "Voltage: ", model["Voltage"]
print "Price: ", model["Price"]
c = raw_input("\nVal av Model: ").upper()
d = raw_input("Val av Serie: ").upper()
e = raw_input("Val av Voltage: ").upper()
print "\nDu har valt följande: ", c, d, e
print "\nPriset för detta produkt är:\n "
tänk dig att jag valde "CT", "35x serie" och "230V", hur skall jag göra så att det ger mig rätt pris motsvarande produkten jag vald?
MVH
- Henrik E
- Medlem
Offline
- Registrerad: 2015-09-22
- Inlägg: 3189
Re: Python: Val av produkt => pris
Hur beror priset på serie och voltage? Det står bara tre priser men inte vad som ger vilket pris.
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Re: Python: Val av produkt => pris
Henrik E skrev:
Hur beror priset på serie och voltage? Det står bara tre priser men inte vad som ger vilket pris.
Henrik, du har tre serier och motsvarande pris har du under Price, ex. Modular, 82x, 600(pris).
MVH
- Henrik E
- Medlem
Offline
- Registrerad: 2015-09-22
- Inlägg: 3189
Re: Python: Val av produkt => pris
for model in modeler:
if model["name"]!=c: continue
for i, serie in enumerate(model["Serier"]):
if serie!=d: continue
print model["Price"][i]
Men det är en olämplig datastruktur. Bättre med en lista av poster av typ ("CT","45x",300).
Då blir hela sökningen så här
for x in databas:
if x[0]==c and x[1]=d: print x[2]
Och ännu bättre med en lista av objekt så att man kan skriva
if x.name=c and x.serie=d: print x.pris
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Re: Python: Val av produkt => pris
Henrik E skrev:
for model in modeler:
if model["name"]!=c: continue
for i, serie in enumerate(model["Serier"]):
if serie!=d: continue
print model["Price"][i]
Men det är en olämplig datastruktur. Bättre med en lista av poster av typ ("CT","45x",300).
Då blir hela sökningen så här
for x in databas:
if x[0]==c and x[1]=d: print x[2]
Och ännu bättre med en lista av objekt så att man kan skriva
if x.name=c and x.serie=d: print x.pris
Henrik,
Jag har testat din, lite överkurs kanske för min del, det printar inte ut något.......
Ska kolla på det andra förslag och testa, tack
- Henrik E
- Medlem
Offline
- Registrerad: 2015-09-22
- Inlägg: 3189
Re: Python: Val av produkt => pris
Det är för att du skrivit .upper() När man matar in 45x förvandlas det till 45X och någon sådan serie finns inte.
- annlu
- Medlem
Offline
- Registrerad: 2016-11-02
- Inlägg: 58
Re: Python: Val av produkt => pris
Hej!
Jag håller med Henrik att det finns bättre sätt att representera produkterna på. Men att behöva loopa igenom modellerna för att hitta den som användaren valde känns långt ifrån optimalt. Finns det många produkter är såklart en databas (typ MySQL) det bästa alternativet. Men som start för att träna och lära sig lite Python som du gör funkar såklart ditt sätt. Jag gillar din struktur med dictionaries som innehåller all info om varje modell (det är lite NoSQL över det, typ MongoDB) men jag skulle ändå vilja föreslå en mindre förändring som gör din datastruktur mer lätthanterlig i kod.
Istället för att ha modellerna i en lista; modeler = [a, b] kan du ha dem i ett dictionary med modellen som key: modeler = {"Modular": a, "CT": b}
Det ändrar inte din grundstruktur men du kan lättare ta fram och arbeta med varje modell via modeler["modell_du_vill_arbeta_med"]. Din for loop för att printa ut produkterna blir då bara lite annorlunda (se nedan).
Eftersom serie och seriens pris står på samma plats (index) i sina respektive listor kan du matcha dem genom att använda index(elem) som returnerar index för det element man anger (då undviker du loopar även där). Med exemplet CT och 35x blir det:
index = modeler["CT"]["Serier"].index("35x") ger index 0, första positionen i serielistan
Priset för 35x finns alltså på index 0:
pris = modeler["CT"]["Price"][0]
Din kod med denna något modifierade struktur blir:
Kod:
a = {"name": "Modular", "Serier":['72x', '82x', '92x'], "Voltage": [208, 230, 400, 480], "Price": [500, 600, 700]} b = {"name": "CT", "Serier": ['35x', '45x', '52x'], "Voltage": [208, 230, 400, 480], "Price": [200, 300, 400]} modeler = {"Modular": a, "CT": b} # För att printa ut infon kan du loopa över key och value där # key är namnet på modellen och # value är dina dictionaries med all info om varje modell: for key, model in modeler.items(): print print "Name: ", model["name"] print "Serier: ", model["Serier"] print "Voltage: ", model["Voltage"] print "Price: ", model["Price"] # Varför hade du .upper()? Du konverterar användarens alla svar # till versaler, men i din databas har du både små och stora # bokstäver (Modular, CT, x35). Tänk på att Python ser skillnad och # jämför du t.ex. 35x med 35X är det inte samma sak. # Se Henriks kommentar, hans lösning fungerar, men inte om det # blir fel här för dig. c = raw_input("\nVal av Model: ") d = raw_input("Val av Serie: ") e = raw_input("Val av Voltage: ") print "\nDu har valt följande: ", c, d, e index = modeler[c]["Serier"].index(d) pris = modeler[c]["Price"][index] print "\nPriset för denna produkt är:\n ", pris
Senast redigerat av annlu (2016-12-24 18:38)
- annlu
- Medlem
Offline
- Registrerad: 2016-11-02
- Inlägg: 58
Re: Python: Val av produkt => pris
Henrik E skrev:
for model in modeler:
if model["name"]!=c: continue
for i, serie in enumerate(model["Serier"]):
if serie!=d: continue
print model["Price"][i]
emehraj skrev:
Jag har testat din, lite överkurs kanske för min del
Har du svårt att förstå Henriks lösning så kan den också skrivas mer rättframt så här:
for model in modeler:
if model["name"] == c:
for i, serie in enumerate(model["Serier"]):
if serie == d:
print model["Price"][i]
De båda kodblocken gör alltså exakt samma sak fast olika sätt att skriva det på.
enumerate ger dig, förutom elementen i serielistan (serie) också elementens index (i).
En nackdel med denna kod är att den loopar igenom alla produkter och alla serier, även efter det att man hittat den modell/serie man var ute efter. Ett alternativ är att använda break när man hittat det man letade efter för att avsluta loopen.
- Henrik E
- Medlem
Offline
- Registrerad: 2015-09-22
- Inlägg: 3189
Re: Python: Val av produkt => pris
Utmärkta kommentarer av annlu!
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Re: Python: Val av produkt => pris
annlu skrev:
Hej!
Jag håller med Henrik att det finns bättre sätt att representera produkterna på. Men att behöva loopa igenom modellerna för att hitta den som användaren valde känns långt ifrån optimalt. Finns det många produkter är såklart en databas (typ MySQL) det bästa alternativet. Men som start för att träna och lära sig lite Python som du gör funkar såklart ditt sätt. Jag gillar din struktur med dictionaries som innehåller all info om varje modell (det är lite NoSQL över det, typ MongoDB) men jag skulle ändå vilja föreslå en mindre förändring som gör din datastruktur mer lätthanterlig i kod.
Istället för att ha modellerna i en lista; modeler = [a, b] kan du ha dem i ett dictionary med modellen som key: modeler = {"Modular": a, "CT": b}
Det ändrar inte din grundstruktur men du kan lättare ta fram och arbeta med varje modell via modeler["modell_du_vill_arbeta_med"]. Din for loop för att printa ut produkterna blir då bara lite annorlunda (se nedan).
Eftersom serie och seriens pris står på samma plats (index) i sina respektive listor kan du matcha dem genom att använda index(elem) som returnerar index för det element man anger (då undviker du loopar även där). Med exemplet CT och 35x blir det:
index = modeler["CT"]["Serier"].index("35x") ger index 0, första positionen i serielistan
Priset för 35x finns alltså på index 0:
pris = modeler["CT"]["Price"][0]
Din kod med denna något modifierade struktur blir:Kod:
a = {"name": "Modular", "Serier":['72x', '82x', '92x'], "Voltage": [208, 230, 400, 480], "Price": [500, 600, 700]} b = {"name": "CT", "Serier": ['35x', '45x', '52x'], "Voltage": [208, 230, 400, 480], "Price": [200, 300, 400]} modeler = {"Modular": a, "CT": b} # För att printa ut infon kan du loopa över key och value där # key är namnet på modellen och # value är dina dictionaries med all info om varje modell: for key, model in modeler.items(): print print "Name: ", model["name"] print "Serier: ", model["Serier"] print "Voltage: ", model["Voltage"] print "Price: ", model["Price"] # Varför hade du .upper()? Du konverterar användarens alla svar # till versaler, men i din databas har du både små och stora # bokstäver (Modular, CT, x35). Tänk på att Python ser skillnad och # jämför du t.ex. 35x med 35X är det inte samma sak. # Se Henriks kommentar, hans lösning fungerar, men inte om det # blir fel här för dig. c = raw_input("\nVal av Model: ") d = raw_input("Val av Serie: ") e = raw_input("Val av Voltage: ") print "\nDu har valt följande: ", c, d, e index = modeler[c]["Serier"].index(d) pris = modeler[c]["Price"][index] print "\nPriset för denna produkt är:\n ", pris
Hej,
Otroligt tacksam för dina kommentarer, skall testa och återkomma om det dyker upp frågor.
God fortsättning