2016-10-30 1 views
2

Das ist also ein Code, den ich in Übung 6 bis 9 von Kapitel 6 in Python Crash Course Buch gemacht habe.Gibt es eine bessere Möglichkeit, diese Schlüssel/Wert-Paare zu drucken?

favorite_places = { 
'joe': { 
    'paris': 'france', 
    'hamburg': 'germany', 
    'cairo': 'egypt', 
    }, 
'anna': { 
    'tripoli': 'libya', 
    'tokyo': 'japan', 
    'moskva': 'russia', 
    }, 
'henry': { 
    'sydney': 'australia', 
    'quebec': 'canada', 
    'rio de janeiro': 'brazil', 
    } 
} 

for person, places in favorite_places.items(): 
    print(person.title() + "'s favorite places are: ") 
    places = places.items() 
    for place in places: 
     print(place[0].title() + " in " + place[1].title() + ".") 
    print("\n") 

Dann ist die Ausgabe wie folgt aus:

Joe's favorite places are: 
Cairo in Egypt. 
Hamburg in Germany. 
Paris in France. 

Gibt es eine Möglichkeit, nur den Schlüsselwert aus den Orten Variable zu erhalten und es auf die gleiche Weise drucke ich tat, aber ohne Orte eine Umwandlung Liste? Ich denke, dass es so ein bisschen chaotisch ...

Antwort

3

durch diesen Python

places = places.items() 

dabei 3 Sie nicht in eine Liste konvertieren, aber Sie Zugriff auf einen Iterator, die den Schlüssel, Wert-Paar ergibt also ist es der beste Weg, es zu tun.

(Python 2 entsprechen iteritems, in Python 2 items gibt eine Liste der Paare, aber das Verhalten in Python 3 geändert hat)

(was überrascht mich am meisten 1) Ihre Vertiefung und 2) werden Sie sein besser das Schreiben direkt das ein Array oder eine Variable TEMP ohne Verwendung (die Paare direkt in 2 Variablen Auspacken elegantere ist und format verwenden, wie in den Kommentaren angegeben, die elegantere & performante ist)

for town,country in places.items(): 
    print("{} in {}.".format(town.title(),country.title()) 
print("\n") 
+0

, dass einige dumme Fehler ist Einrücken .... Aber ja, ich verstehe, was Sie darauf aus und danke für die Antwort. :) –

+1

Sie sollten die Zeichenfolgen nicht zusammenfügen. Das isst CPU und es ist nicht Python! Verwenden Sie stattdessen '% s' oder' .format', was für python3 –

+0

beliebter ist, während wir versuchen, das pythischste zu sein, haben Sie Recht. Habe einfach den OP-Code kopiert, ohne ihn zu ändern. Bearbeitet. –

0

A etwas kürzer Weg (immer noch mit der Liste obwohl) wäre:

for person in favorite_places: 
    print("%s's favorite places are: " %person.title()) 
    [print('%s in %s.' %(i.title(),z.title())) for i,z in favorite_places[person].items()] 
    print('\n') 
+0

Gibt es irgendwo eine solche Regel, die ich vermisst habe? – spyrostheodoridis

+1

[Ist es Pythonic, Listenkompromittierung für gerade Nebenwirkungen zu verwenden?] (Http://stackoverflow.com/q/5753597/3821804) – GingerPlusPlus

+0

Kühl, jetzt verstehe ich es. Vielen Dank! – spyrostheodoridis

1

Format ist jetzt in der Mode für mich hier so ist eine andere coole Art, dies zu tun:

for name, places in favorite_places.items(): 
    print("{}'s favorite places are:".format(name.capitalize())) 
    for city, country in places.items(): 
     print("{} in {}.".format(city.capitalize(), country.capitalize())) 
    print('\n') 
+0

Ich bekomme, was Sie zu sagen versuchen, und es ist ein gültiger Punkt, aber Ihr Code funktioniert nicht – GingerPlusPlus

+1

was Sie vermeiden sollten, selbst wenn es funktionierte, ist die Notwendigkeit, den Schlüssel bei jeder Iteration Hash. Sie werden durch das ganze Wörterbuch iterieren, also verwenden Sie besser 'items()' –

+0

... und tuple entpacken, das würde auch Ihren Code lesbarer machen: 'für Namen, Orte in favorite_places.items()', 'für Land "City in Place" – GingerPlusPlus

Verwandte Themen