[python] Problemen met dictionaries

Pagina: 1
Acties:
  • 196 views sinds 30-01-2008
  • Reageer

  • yootje
  • Registratie: December 2002
  • Laatst online: 29-09 07:24
Ik heb nu de volgende code:

code:
1
2
3
4
5
6
7
8
thee = {'china' : '30','lievelingsdrinken' : '20','lievelingseten' : '70'}

blaat = thee.values()

waarde = 100

for i in blaat:
    if i < waarde:


Ik wil met dit script graag de laagste waarde uit de dictionary eruit halen. Nu krijg ik met dit script wel een output van de laagste waarde, maar niet welk woord erbij hoort. Hoe krijg ik dit voor elkaar. Nu is er de method keys, maar ik zie niet hoe ik dit snel moet koppelen aan die laagste waarde.

En nog een vraag: ik heb bijvoorbeeld ook een dictionary "china" met allemaal waarden. Als ik eenmaal een woord heb gevonden in de dictionary thee, in dit geval china, moet ik in dictionary china zoeken naar een laagste waarde. Hoe krijg ik dit voor elkaar? Want china is dan gewoon de waarde van een variabele.

[ Voor 6% gewijzigd door yootje op 09-01-2007 22:58 ]


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Een dictionary mapt sleutels op waardes, niet waardes op sleutels. Je kunt waardes dus niet als index gebruiken. Wat wel werkt is dit:

Python:
1
2
3
4
5
6
7
8
9
10
thee = {'china' : '30','lievelingsdrinken' : '20','lievelingseten' : '70'}
sleutel = ""
waarde = 100

for key in thee:
    if (thee[key] < waarde):
        sleutel = key
        waarde = thee[key]

print "laagste waarde: ", waarde, "sleutel: ", sleutel

[ Voor 7% gewijzigd door DroogKloot op 09-01-2007 23:26 ]


  • yootje
  • Registratie: December 2002
  • Laatst online: 29-09 07:24
Dankjewel! het werkte niet gelijk, maar ik heb de volgende code nu:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
thee = {'china' : '20','lievelingsdrinken' : '30','lievelingseten' : '70'}

onderwerpen = ['lievelingseten','lievelingsdrinken','thee']

waarde = int('100')
theeinhoud = thee.keys()

for i in theeinhoud:
    getal = int(thee[i])
    if (getal < waarde):
        waarde = thee[i]
        sleutel = i
        
print 'De laagste waarde is ', sleutel, ' en daarvan is de waarde ', waarde


Deze werkt perfect. Alleen nu wil ik de waarde van de laagste sleutel weer opnieuw invoeren, ik heb dus een dictionary die zo heet als de laagste sleutel, en die wil ik in een for loop stoppen. Hoe doe ik dit?

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Nog even over je eerste probleem: je kan ook een sort doen op de dictionary en dan het eerste element pakken (die dan de laagste waarde heeft). Aangezien je niet wilt sorteren op de keys maar op de values kun je niet thee.sort() doen, maar Python heeft wat handige truukjes hiervoor:

Python:
1
2
3
4
// gesorteerd op waarde:
sorted(thee.items(), key=lambda (k,v): (v,k))
// omgekeerd gesorteerd op waarde:
sorted(thee.items(), key=lambda (k,v): (v,k), reverse = True)


sorted() is een built-in function, met key = ... geef je aan op welke sleutel er gesorteerd moet worden, ... is in dit geval lambda (k,v): (v,k) waarbij lambda een ingebouwde naam is voor een soort anoniem functie die hier steeds van een key->value set een value->key lijst maakt zodat er op de value van je dictionary wordt gesorteerd. Ik hoop dat ik dit een beetje goed uitleg. :P

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17:46

Robtimus

me Robtimus no like you

yootje schreef op woensdag 10 januari 2007 @ 17:07:
Dankjewel! het werkte niet gelijk, maar ik heb de volgende code nu:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
thee = {'china' : '20','lievelingsdrinken' : '30','lievelingseten' : '70'}

onderwerpen = ['lievelingseten','lievelingsdrinken','thee']

waarde = int('100')
theeinhoud = thee.keys()

for i in theeinhoud:
    getal = int(thee[i])
    if (getal < waarde):
        waarde = thee[i]
        sleutel = i
        
print 'De laagste waarde is ', sleutel, ' en daarvan is de waarde ', waarde


Deze werkt perfect. Alleen nu wil ik de waarde van de laagste sleutel weer opnieuw invoeren, ik heb dus een dictionary die zo heet als de laagste sleutel, en die wil ik in een for loop stoppen. Hoe doe ik dit?
Ik heb nogwal wat vraagjes over je code:
1) waarom sla je de waarden in de dictionary op als strings als je weet dat ze altijd getallen zijn en je ze ook als getal behandelt?
2) waarom is de assignment aan waarde zo omslachtig? Waarom niet gewoon "waarde = 100" ?
3) Waarom doe je in de loop niet gewoon "waarde = getal" ? waarde is initieel een getal, dus waarom er dan opeens in de loop een string (thee[i]) aan assignen? Bovendien heeft getal geen dictionary lookup nodig.
4) waarom extract je de keys uit je dictionary om er vervolgens niks mee te doen?

Dus:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
thee = {'china' : 20, 'lievelingsdrinken' : 30, 'lievelingseten' : 70}

onderwerpen = ['lievelingseten', 'lievelingsdrinken', 'thee']
# gebruik alsjeblieft spaties na de comma's, dat leest veel prettiger

waarde = 100

# thee.keys() is niet eens nodig, hij itereert daar standaard al over
for i in thee:
    getal = thee[i]
    if (getal < waarde):
        waarde = getal
        sleutel = i
print 'De laagste waarde is', sleutel, 'en daarvan is de waarde', waarde
# als je print gebruikt met comma's ertussen dan scheidt hij het al door
# spaties, dus extra spaties in de strings is niet nodig

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • yootje
  • Registratie: December 2002
  • Laatst online: 29-09 07:24
IceManX schreef op woensdag 10 januari 2007 @ 19:58:
[...]
Ik heb nogwal wat vraagjes over je code:
1) waarom sla je de waarden in de dictionary op als strings als je weet dat ze altijd getallen zijn en je ze ook als getal behandelt?
2) waarom is de assignment aan waarde zo omslachtig? Waarom niet gewoon "waarde = 100" ?
3) Waarom doe je in de loop niet gewoon "waarde = getal" ? waarde is initieel een getal, dus waarom er dan opeens in de loop een string (thee[i]) aan assignen? Bovendien heeft getal geen dictionary lookup nodig.
4) waarom extract je de keys uit je dictionary om er vervolgens niks mee te doen?

Dus:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
thee = {'china' : 20, 'lievelingsdrinken' : 30, 'lievelingseten' : 70}

onderwerpen = ['lievelingseten', 'lievelingsdrinken', 'thee']
# gebruik alsjeblieft spaties na de comma's, dat leest veel prettiger

waarde = 100

# thee.keys() is niet eens nodig, hij itereert daar standaard al over
for i in thee:
    getal = thee[i]
    if (getal < waarde):
        waarde = getal
        sleutel = i
print 'De laagste waarde is', sleutel, 'en daarvan is de waarde', waarde
# als je print gebruikt met comma's ertussen dan scheidt hij het al door
# spaties, dus extra spaties in de strings is niet nodig
Hartstikke bedankt voor de tips! Ik ben vrij nieuw met Python, dus ze helpen me echt :)

  • yootje
  • Registratie: December 2002
  • Laatst online: 29-09 07:24
Ik heb inmiddels een aardig script opgebouwd, alleen mijn enige probleem is nog dat ik de van de variabele naam een gewone string moet maken. Is dit mogelijk?

Verwijderd

Wat bedoel je van de variabel naam een string maken? Als je 'sleutel' bedoelt, de waarde van sleutel (bijv. 'china' of 'lievelingseten') is al een string.

Misschien ten overvloede, maar met deze one-liner kan je ook de sleutel krijgen met de laagste waarde:
Python:
1
2
3
thee = {'china' : 20, 'lievelingsdrinken' : 30, 'lievelingseten' : 70}
sleutel = min(thee, key=lamdba x: thee[x])
print 'De laagste waarde is', sleutel, 'en daarvan is de waarde', waarde

  • yootje
  • Registratie: December 2002
  • Laatst online: 29-09 07:24
Verwijderd schreef op donderdag 11 januari 2007 @ 22:20:
Wat bedoel je van de variabel naam een string maken? Als je 'sleutel' bedoelt, de waarde van sleutel (bijv. 'china' of 'lievelingseten') is al een string.

Misschien ten overvloede, maar met deze one-liner kan je ook de sleutel krijgen met de laagste waarde:
Python:
1
2
3
thee = {'china' : 20, 'lievelingsdrinken' : 30, 'lievelingseten' : 70}
sleutel = min(thee, key=lamdba x: thee[x])
print 'De laagste waarde is', sleutel, 'en daarvan is de waarde', waarde
Dat was niet wat ik bedoelde, maar bedankt voor de tip :)
Pagina: 1