Lösung mit Dictionary oder Liste?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Dienstag 17. April 2007, 23:04

Hallo zusammen,

welches der beiden Beispiele würdet ihr bevorzugen und warum?
Oder eine ganz andere Fassung?

Version 1

Code: Alles auswählen

import random

laender_staedte = [("Italien","Rom"), ("Spanien","Madrid"),
                ("Belgien","Brüssel"), ("Frankreich","Paris")]

while laender_staedte:

    land, stadt = random.choice(laender_staedte)
    eingabe = raw_input("Bitte die Hauptstadt von %s eingeben: " % land)

    if eingabe:
        if eingabe == stadt:
            print "Bravo, das ist richtig!"
            laender_staedte.remove((land, stadt))
        elif eingabe == "e":
            break
        else:
            print "Oh je, das ist falsch!"
    else:
        print "Bitte geben Sie was ein!"
    
print "Ende des Programms"
Version 2


Code: Alles auswählen

import random

laender_staedte = {"Italien":"Rom", "Spanien":"Madrid",
                "Belgien":"Brüssel", "Frankreich":"Paris"}  

laender=laender_staedte.keys() 

while laender:

    land = random.choice(laender)
    eingabe = raw_input("Bitte die Hauptstadt von %s eingeben: " % land)

    if eingabe:
        if laender_staedte[land] == eingabe:
            print "Bravo, das ist richtig!"
            laender.remove(land)
        elif eingabe == "e":
            break
        else:
            print "Oh je, das ist falsch!"
    else:
        print "Bitte geben Sie was ein!"     
    
print "Ende des Programms"
LG

rolgal_reloaded
BlackJack

Mittwoch 18. April 2007, 08:39

Hauptunterschied ist, dass bei der ersten Variante die `laender_staedte`-Datenstruktur "zerstört" wird, bei der zweiten kann man noch eine Schleife drumherum bauen und die `laender`-Liste wieder vom Dictionary abfragen.

Ansonsten hat das `remove()` auf Listen lineare Laufzeit. Das ist in diesem Fall sicher nicht schlimm, aber da sollte man immer dran denken.

Ich hätte es so geschrieben:

Code: Alles auswählen

import random

laender_staedte = [('Italien', 'Rom'),
                   ('Spanien', 'Madrid'),
                   ('Belgien', 'Brüssel'),
                   ('Frankreich', 'Paris')]

random.shuffle(laender_staedte)

for land, stadt in laender_staedte:
    eingabe = raw_input('Bitte die Hauptstadt von %s eingeben: ' % land)
    if eingabe.lower() == stadt.lower():
        print 'Bravo, das ist richtig!'
    elif eingabe == 'e':
        break

print 'Ende des Programms'
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 18. April 2007, 09:50

Hi BlackJack,

was ist an random.shuffle interessanter oder einfach anders als wie an random.choice?

Die Sache mit lower() ist natürlich sehr sinnvoll.

LG

rolgal_reloaded
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 18. April 2007, 10:08

rolgal_reloaded hat geschrieben:was ist an random.shuffle interessanter oder einfach anders als wie an random.choice?
Mit "shuffle" mischt du die Elemente und mit "choice" wählst du zufällig ein Element aus der Liste aus.

Wenn man die Liste gemischt hat, kann man über diese laufen und fragt jedes Element genau ein mal ab. Bei deiner Lösung können auch Städte doppelt abgefragt werden. Kommt halt darauf an, was man genau machen möchte.

Beliebtes Beispiel ist das ziehen von Lottozahlen. Das geht mit "shuffle" viel besser, da mein bei "choice" immer überprüfen müßte, ob die Zahl schon gezogen wurde.

Ach ja: "random" und all seine Funktionen ist recht gut in der Doku beschrieben!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 18. April 2007, 10:21

OT: Für Lottozahlen ist wahrscheinlich random.sample() auch recht hilfreich :)

Code: Alles auswählen

In [2]: random.sample(range(50), 6)
Out[2]: [27, 30, 40, 25, 3, 44]
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 18. April 2007, 11:21

EyDu hat geschrieben:
rolgal_reloaded hat geschrieben:was ist an random.shuffle interessanter oder einfach anders als wie an random.choice?
Mit "shuffle" mischt du die Elemente und mit "choice" wählst du zufällig ein Element aus der Liste aus.

Wenn man die Liste gemischt hat, kann man über diese laufen und fragt jedes Element genau ein mal ab. Bei deiner Lösung können auch Städte doppelt abgefragt werden. Kommt halt darauf an, was man genau machen möchte.
Ich dachte es ist sinnvoll, wenn es solange wiederkommt bis die Antwort richtig ist. Wenn du guckst, wird der Eintrag dann ja aus der Liste entfernt.
Aber shuffle ist trotzdem interessant und werde ich mir merken, danke für die Erklärung.

Ach ja: "random" und all seine Funktionen ist recht gut in der Doku beschrieben!
Wenn ich alles in der Doku nachlesen würde, könnte ich micht nicht so oft im Forum unterhalten:D

LG

rolgal_reloaded
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Mittwoch 18. April 2007, 13:41

Würde dich aber auch oftmals schneller zum Ziel führen - ein Forum hat eben eine bestimmte Reaktionszeit. :wink:
LG
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 18. April 2007, 14:06

CrackPod hat geschrieben:Würde dich aber auch oftmals schneller zum Ziel führen - ein Forum hat eben eine bestimmte Reaktionszeit. :wink:
LG
Danke, aber mir passts gut so :D

LG

rolgal_reloaded
Antworten