Meddelande

Du befinner dig just nu på en äldre version av Pluggakuten, gamla.pluggakuten.se. Nya Pluggakuten lanserades den 6 februari 2017 och du finner forumet på www.pluggakuten.se.

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 smile

 
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 smile

 


Sidfot

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Powered by Mattecentrum
 |  Denna sida använder cookies |  Kontakta oss |  Feedback |