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, dictionaries & list
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Python, dictionaries & list
Hej på er,
Nedan är min kod:
# -*- coding: utf-8 -*-
resa = {"Hotel_Price": [('Danmark',900), ('Tyskland',1000),
('Holland',1100), ('Frankrike',1200), ('Belgien',1300)],
"Distance": [('Danmark',500), ('Tyskland',900), ('Holland',1150),
('Frankrike',1250), ('Belgien',1400)],
"Car_Price": [('Ford',80), ('VW',110), ('Audi',150), ('BMW',180)],
}
for key, model in sorted(resa.items()):
print "\n",key,resa[key],"\n"
a = raw_input("Vart vill du resa? ")
print "\nDu valde:", a, "som har avstånd:", resa["Distance"][key][?]
Print ger mig detta:
.
.
.
.
.
TypeError: list indices must be integers, not str
Mina frågor:
1- Är min Dictionary "fel byggd"?
2- Hur kan koden fattar att a="Vald land" + Avstånd
3- När det är dags att addera dem, räcker det att jag lägger till "int()" framför?
MVH
- annlu
- Medlem
Offline
- Registrerad: 2016-11-02
- Inlägg: 58
Re: Python, dictionaries & list
emehraj skrev:
1- Är min Dictionary "fel byggd"?
Det finns många sätt att representera information, och något är sällan rätt eller fel, kanske bara mer eller mindre praktiskt eller resurskrävande. Du har byggt upp en ganska komplex struktur med ett dictionary {key: value}, som innehåller listor [elem1, elem2, elem3, …] som i sin tur innehåller tuples (elem_a, elem_b).
Det är dock uppenbart från din kod att du skulle vilja få fram dina uppgifter enkelt genom att skriva exempelvis:
resa["Distance"]["Tyskland"] och då få ut 900. Du kan faktiskt enkelt få till en sådan struktur, ser du hur? Tänk på att du får ha dictionaries inne i ett annat dictionary, så här:
Kod:
dictionary = {"key1": {"key1a": "value1a", "key1b": "value1b", "key1c": "value1c"}, "key2": {"key2a": "value2a", "key2b": "value2b"} }
Jag tror du skulle uppskatta enkelheten av att inte alls använda vare sig list eller tuples.
emehraj skrev:
2- Hur kan koden fattar att a="Vald land" + Avstånd
Menar du: Hur kan jag i kod få fram avståndet för det land som användaren har valt?
Om du gör om din struktur och bara använder ditionaries så blir detta som sagt enkelt via resa["Distance"]["Tyskland"]. Men med din nuvarande struktur kommer du bara åt din lista genom resa["Distance"] och därifrån måste du loopa igenom listan, där varje element är en tuple. Då måste du alltså kolla om tuplens första element är det land som användaren valt, och om så är fallet så hittar du avståndet i tuplens andra element. Detta är fullt görligt, och väldigt bra träning eftersom du lär dig att hämta element från dictionaries, listor och tuples (!). Försök gärna att skriva en sådan loop!
emehraj skrev:
3- När det är dags att addera dem, räcker det att jag lägger till "int()" framför?
Vad är det du vill du addera? Testa själv här, behöver du int() eller fungerar det utan?
emehraj skrev:
TypeError: list indices must be integers, not str
Jag misstänker att du får detta felmeddelande när koden försöker göra följande:print "\nDu valde:", a, "som har avstånd:", resa["Distance"][key]
Jag tror din tanke var att skriva a istället för key? I vilket fall som helst så är både a och key en sträng: a med något land som användaren valt (t.ex. "Tyskland") och key är den sista key i den tidigare for loopen, alltså "Hotel_Price". När koden resa["Distance"][key]
körs får du i det första steget (resa["Distance"]
) tillbaka listan [('Danmark',500), ('Tyskland',900), ('Holland',1150), ('Frankrike',1250), ('Belgien',1400)]
eller hur? Du kan plocka element från en lista med list[index] där index är 0, 1, 2, 3, osv, men inte med en textsträng: list[key]. Du använder alltså din lista som om det vore ett dictionary! (Därför tror jag det är en bra ide att du gör om hela din struktur till ett sådant )
Testa lite och säg till ifall några frågor dyker upp!
Ett extra tips: När man programmerar underlättar det mycket att skriva tydliga variabelnamn. a säger inte mycket om vad det är för något. Andra alternativ är land, user_country, usr_country, valt_land etc. Det är trevligt med korta namn (kanske c för country eller l för land) men i alla fall något som förknippas med innehållet. Med tydliga namn förstår man själv koden lättare, de som läser koden förstår lättare (vänner, kollegor, lärare, pluggakutare) och när man ser tillbaka på sin kod efter några månader kommer man lättare in i den igen. Här är det ganska ok eftersom det bara är a, men i din förra tråd hade du c, d, e och det var inte helt lätt att hålla ordning på vad som var vad
Likadant i din for loop. Du använder key, men model säger inget. Eftersom du i detta fall inte ens använder den variabeln brukar man i Python döpa sådana oanvända variabler till bara ett understreck:
Kod:
for key, _ in sorted(resa.items()):
Senast redigerat av annlu (2016-12-30 08:11)
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Re: Python, dictionaries & list
annlu skrev:
emehraj skrev:
1- Är min Dictionary "fel byggd"?
Det finns många sätt att representera information, och något är sällan rätt eller fel, kanske bara mer eller mindre praktiskt eller resurskrävande. Du har byggt upp en ganska komplex struktur med ett dictionary {key: value}, som innehåller listor [elem1, elem2, elem3, …] som i sin tur innehåller tuples (elem_a, elem_b).
Det är dock uppenbart från din kod att du skulle vilja få fram dina uppgifter enkelt genom att skriva exempelvis:
resa["Distance"]["Tyskland"] och då få ut 900. Du kan faktiskt enkelt få till en sådan struktur, ser du hur? Tänk på att du får ha dictionaries inne i ett annat dictionary, så här:Kod:
dictionary = {"key1": {"key1a": "value1a", "key1b": "value1b", "key1c": "value1c"}, "key2": {"key2a": "value2a", "key2b": "value2b"} }Jag tror du skulle uppskatta enkelheten av att inte alls använda vare sig list eller tuples.
emehraj skrev:
2- Hur kan koden fattar att a="Vald land" + Avstånd
Menar du: Hur kan jag i kod få fram avståndet för det land som användaren har valt?
Om du gör om din struktur och bara använder ditionaries så blir detta som sagt enkelt via resa["Distance"]["Tyskland"]. Men med din nuvarande struktur kommer du bara åt din lista genom resa["Distance"] och därifrån måste du loopa igenom listan, där varje element är en tuple. Då måste du alltså kolla om tuplens första element är det land som användaren valt, och om så är fallet så hittar du avståndet i tuplens andra element. Detta är fullt görligt, och väldigt bra träning eftersom du lär dig att hämta element från dictionaries, listor och tuples (!). Försök gärna att skriva en sådan loop!emehraj skrev:
3- När det är dags att addera dem, räcker det att jag lägger till "int()" framför?
Vad är det du vill du addera? Testa själv här, behöver du int() eller fungerar det utan?
emehraj skrev:
TypeError: list indices must be integers, not str
Jag misstänker att du får detta felmeddelande när koden försöker göra följande:
print "\nDu valde:", a, "som har avstånd:", resa["Distance"][key]
Jag tror din tanke var att skriva a istället för key? I vilket fall som helst så är både a och key en sträng: a med något land som användaren valt (t.ex. "Tyskland") och key är den sista key i den tidigare for loopen, alltså "Hotel_Price". När kodenresa["Distance"][key]
körs får du i det första steget (resa["Distance"]
) tillbaka listan[('Danmark',500), ('Tyskland',900), ('Holland',1150), ('Frankrike',1250), ('Belgien',1400)]
eller hur? Du kan plocka element från en lista med list[index] där index är 0, 1, 2, 3, osv, men inte med en textsträng: list[key]. Du använder alltså din lista som om det vore ett dictionary! (Därför tror jag det är en bra ide att du gör om hela din struktur till ett sådant)
Testa lite och säg till ifall några frågor dyker upp!
Ett extra tips: När man programmerar underlättar det mycket att skriva tydliga variabelnamn. a säger inte mycket om vad det är för något. Andra alternativ är land, user_country, usr_country, valt_land etc. Det är trevligt med korta namn (kanske c för country eller l för land) men i alla fall något som förknippas med innehållet. Med tydliga namn förstår man själv koden lättare, de som läser koden förstår lättare (vänner, kollegor, lärare, pluggakutare) och när man ser tillbaka på sin kod efter några månader kommer man lättare in i den igen. Här är det ganska ok eftersom det bara är a, men i din förra tråd hade du c, d, e och det var inte helt lätt att hålla ordning på vad som var vad
Likadant i din for loop. Du använder key, men model säger inget. Eftersom du i detta fall inte ens använder den variabeln brukar man i Python döpa sådana oanvända variabler till bara ett understreck:Kod:
for key, _ in sorted(resa.items()):
Underbart, tack för dina förklaringar. Skall ta mig tid och testa, återkommer med eventuella frågor.
Gott nytt år
- Henrik E
- Medlem
Offline
- Registrerad: 2015-09-22
- Inlägg: 3189
Re: Python, dictionaries & list
Det normala är att ha Danmark som key och (900,500) som value i resedatabasen, alltså
trip={"Danmark":(900,500), "Tyskland": - - - }
for name in trip: print(name)
destination=input("Önskat mål: ")
price,distance=trip[choice]
print("Resan till",destination,"kostar",price,"kr och är",distance,"km.")
- annlu
- Medlem
Offline
- Registrerad: 2016-11-02
- Inlägg: 58
Re: Python, dictionaries & list
Henrik E skrev:
Det normala är att ha Danmark som key och (900,500) som value i resedatabasen, alltså
trip={"Danmark":(900,500), "Tyskland": - - - }
for name in trip: print(name)
destination=input("Önskat mål: ")
price,distance=trip[choice]
print("Resan till",destination,"kostar",price,"kr och är",distance,"km.")
Håller med! Det blir absolut mer lätthanterligt (och "riktigt") att omforma på det sättet.
@emehraj, det är en bra ide att separera data som kommer från olika områden. Alltså ha en
trip = {'Danmark': (900, 500), 'Tyskland': - - - }
som Henrik E beskriver ovan, och sedan en annan för bilarna:
rental_cars = {'Ford': 80, 'VW': 110, - - - }
Sen är jag nog mer fan av dictionaries än du Henrik E så jag skulle nog göra:
trip = {'Danmark': {'hotell': 900, 'dist': 500},
'Tyskland': {'hotell': 1000, 'dist': 900},
'Holland': {- - - }}
för att i framtiden lättare kunna utöka databasen, kunna använda tydliga identifiers för att komma åt element, grupera logiskt efter typ av data. Men det är mer en smakfråga och i detta fall är tuples verkligen väldigt smidiga och lätta att ha att göra med och de minskar storleken på datastrukturen.
- Henrik E
- Medlem
Offline
- Registrerad: 2015-09-22
- Inlägg: 3189
Re: Python, dictionaries & list
Du har så rätt annlu. Jag ville inte dra in mer än nödvändigt, bara. Det är nog enklare med trip[choice].hotel än med trip[choice]["hotel"] så jag skulle överväga namedtuple i stället för dictionary. Om man har gjort
from collections import namedtuple
Data=namedtuple("Data","hotel dist")
så funkar trip={"Danmark": Data(hotel=900, dist=500), - - -} och sedan trip[choice].hotel osv.
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Re: Python, dictionaries & list
@Henrik E och @annlu:
Mycket tacksam med dem olika förklaringar ni gjorde, mycket uppskattad
Det blev så här:
# -*- coding: utf-8 -*-
trip = {'Danmark': {'hotel': 900, 'dist': 500},
'Tyskland': {'hotel': 1000, 'dist': 900},
'Holland': {'hotel': 1100, 'dist': 1150},
'Frankrike': {'hotel': 1200, 'dist': 1250},
'Rent Car': {'Ford':80, 'VW':110, 'Audi':150, 'BMW':180}
}
for a, model in sorted(trip.items()):
print "\n",a,trip[a],"\n"
resa = raw_input("Vart vill du resa? ")
print "\nDu valde:", resa, "som har avstånd:", trip[resa]['dist'], "och hotel:", trip[resa]['hotel'], "per natt"
dagar1 = input("\nHur många dagar vill du stanna i vald land? ")
total1 = int(trip[resa]['hotel']) * dagar1
print "Hotel kostnad: ",total1
rental1 = raw_input("\nVilken bil vill du hyra: ")
print rental1, " kostar", trip['Rent Car'][rental1], "per dag."
rental2 = input("\nHur många dagar? ")
total2 = int(trip['Rent Car'][rental1]) * rental2
print "Kostnad för bilen: ",total2
print "\nDen totala kosnad blir: ",total2 + total1
MVH
- annlu
- Medlem
Offline
- Registrerad: 2016-11-02
- Inlägg: 58
Re: Python, dictionaries & list
Det ser bra ut!
Nu ska jag bara bli extremt petig men kanske kan du ha nytta av det i framtiden:
Du kanske håller med om att exempelvis rental1 och rental2 inte säger något om vilken variabel som är en bilmodell och vilken som är antal dagar. Och att total1 är totala priset för hotell och total2 är den totala kostanden för hyrbil måste man också hålla i minnet.
Jag vill också slå ett fortsatt slag för att du separerar hyrbilarna till en egen struktur:
rental_cars = {'Ford':80, 'VW':110, 'Audi':150, 'BMW':180}.
Du har förvisso en liten databas så att dela upp den kanske känns onödigt, men det är viktigt. En datastruktur bör ha ett fixt mönster så man vet hur man ska få fram informationen och att man kan lita på att all data är sparad på samma sätt. Tänk dig att du har 100 länder med avstånd och hotellpriser i din trip istället för de 4 du har nu. Och så helt plötsligt kommer ett värde med hyrbilar där strukturen är helt annorlunda. Det finns mycket att säga om detta, men grundidén är att alltid dela upp eller gruppera liknande data tillsammans. Det gäller när man skapar databaser, när man gör objekt i objektorienterad programmering och allmänt när man programmerar och hanterar lists, tuples, dictionaries, variabler etc.
God fortsättning! Vi får väl hoppas på att 2017 bjuder på några riktiga resor också. Man blir lite lätt ressugen av att läsa din kod!
- emehraj
- Medlem
Offline
- Registrerad: 2016-12-19
- Inlägg: 17
Re: Python, dictionaries & list
annlu skrev:
Det ser bra ut!
Nu ska jag bara bli extremt petig men kanske kan du ha nytta av det i framtiden:
Du kanske håller med om att exempelvis rental1 och rental2 inte säger något om vilken variabel som är en bilmodell och vilken som är antal dagar. Och att total1 är totala priset för hotell och total2 är den totala kostanden för hyrbil måste man också hålla i minnet.
Jag vill också slå ett fortsatt slag för att du separerar hyrbilarna till en egen struktur:
rental_cars = {'Ford':80, 'VW':110, 'Audi':150, 'BMW':180}.
Du har förvisso en liten databas så att dela upp den kanske känns onödigt, men det är viktigt. En datastruktur bör ha ett fixt mönster så man vet hur man ska få fram informationen och att man kan lita på att all data är sparad på samma sätt. Tänk dig att du har 100 länder med avstånd och hotellpriser i din trip istället för de 4 du har nu. Och så helt plötsligt kommer ett värde med hyrbilar där strukturen är helt annorlunda. Det finns mycket att säga om detta, men grundidén är att alltid dela upp eller gruppera liknande data tillsammans. Det gäller när man skapar databaser, när man gör objekt i objektorienterad programmering och allmänt när man programmerar och hanterar lists, tuples, dictionaries, variabler etc.
God fortsättning! Vi får väl hoppas på att 2017 bjuder på några riktiga resor också. Man blir lite lätt ressugen av att läsa din kod!
Jag håller med, har bara döpt dem till nåt för att kunna testa, jag kommer att ha bättre namn i framtiden. Tack för din tid och en underbar 2017 önskar jag för dig
MVH