2016-05-17 6 views
2

Ich schreibe ein Programm mit Wörterbüchern in einer Liste verschachtelt. Ich möchte den Namen jedes Wörterbuchs beim Durchlaufen der Liste drucken, weiß aber nicht, wie das geht, ohne den gesamten Inhalt des Wörterbuchs aufzurufen. Hier ist mein Code:Wie arbeite ich mit dem Namen eines verschachtelten Wörterbuchs?

sam = { 
'food' : 'tortas', 
'country' : 'mexico', 
'song' : 'Dream On', 
} 
dave = { 
    'food' : 'spaghetti', 
    'country' : 'USA', 
    'song' : 'Sweet Home Alabama', 
    } 

people = [sam, dave] 

for person in people: 
    for key, value in sorted(person.items()): 
     print(#person's name + 
       "'s favorite " + key + " is " + value + ".") 

Hier ist der Ausgang:

's favorite country is mexico. 

's favorite food is tortas. 

's favorite song is Dream On. 

's favorite country is USA. 

's favorite food is spaghetti. 

's favorite song is Sweet Home Alabama. 

Alles funktioniert, ich brauche nur die Namen meiner Wörterbücher zu drucken. Was ist die Lösung?

+2

Objekte haben keine Namen in diesem Sinne. Sie können etwas wie "bob = dave" tun und dann hat das gleiche Objekt zwei Namen. Wenn Sie so etwas wollen, fügen Sie eine weitere Ebene der Verschachtelung hinzu, indem Sie "dave" und "sam" die Schlüssel machen. – BrenBarn

Antwort

1

Werte in einer Liste sind nicht wirklich Variablen mehr. Sie werden nicht durch einen Namen in einem Namespace bezeichnet, sondern durch eine Ganzzahl, die ihre Versätze von der Vorderseite der Liste angibt (0, 1, ...).

Wenn Sie jede dict von Daten mit einem Namen verknüpfen möchten, müssen Sie dies explizit tun. Je nachdem, was für das Verfolgen des Namens verantwortlich ist, gibt es zwei allgemeine Optionen: die Sammlung von Personen oder jede Person in der Sammlung. Die erste und einfachste ist die collections.OrderedDict --- im Gegensatz zu den normalen dict, wird es die Reihenfolge der Personen in Ihrer Liste beibehalten

from collections import OrderedDict 

sam = { 
    'food': 'tortas', 
    'country': 'Mexico', 
    'song': 'Dream On', 
    } 
dave = { 
    'food': 'spaghetti', 
    'country': 'USA', 
    'song': 'Sweet Home Alabama', 
    } 
# The OrderedDict stores each person's name. 
people = OrderedDict([('Sam', sam), ('Dave', dave)]) 

for name, data in people.items(): 
    # Name is a key in the OrderedDict. 
    print('Name: ' + name) 
    for key, value in sorted(data.items()): 
     print(' {0}: {1}'.format(key.title(), value)) 

Alternativ können Sie jeder Person speichern Namen in seinem eigenen dict ... vorausgesetzt, Sie dürfen den Inhalt dieser Wörterbücher ändern. (Außerdem sollten Sie dem Data Dictionary nichts hinzufügen, das Sie dazu zwingen würde, die Daten zu ändern/zu aktualisieren, als Sie es bereits tun. Da die meisten Leute ihr Lieblingsessen oder -lied viel häufiger wechseln, als sie ihren Namen ändern wahrscheinlich sicher ist.)

sam = { 
# Each dict has a new key: 'name'. 
    'name': 'Sam', 
    'food': 'tortas', 
    'country': 'Mexico', 
    'song': 'Dream On', 
    } 
dave = { 
    'name': 'Dave', 
    'food': 'spaghetti', 
    'country': 'USA', 
    'song': 'Sweet Home Alabama', 
    } 
people = [sam, dave] 

for data in people: 
    # Name is a value in the dict. 
    print('Name: ' + data['name']) 
    for key, value in sorted(data.items()): 
     # Have to avoid printing the name again. 
     if 'name' != key: 
      print(' {0}: {1}'.format(key.title(), value)) 

Beachten Sie, dass, wie Sie die Daten drucken davon ab, ob Sie den Namen in der Sammlung speichern (OrderedDict Variante) oder in jeder dict (list Variante Person).

3

Die (mehr) richtige Weg, dies zu tun, ist ein dict von dict s statt zu konstruieren, wie zum Beispiel:

people = {'sam': {'food' : 'tortas', 
        'country' : 'mexico', 
        'song' : 'Dream On', 
        }, 
      'dave': {'food' : 'spaghetti', 
        'country' : 'USA', 
        'song' : 'Sweet Home Alabama', 
        } 
      } 

Dann können Sie einfach wie folgt vor:

for name, person in people.items(): 
    for key, value in sorted(person.items()): 
     print(name + "'s favorite " + key + " is " + value + ".") 

Dieser Wille drucken Sie folgendes:

dave's favorite country is USA. 
dave's favorite food is spaghetti. 
dave's favorite song is Sweet Home Alabama. 
sam's favorite country is mexico. 
sam's favorite food is tortas. 
sam's favorite song is Dream On. 

Als eine Randnotiz ist es besser lesbar String-Formatierung in Ihrer print Anweisung:

print("{0}'s favorite {1} is {2}".format(name, key, value)) 
2

, was Sie im Grunde zu tun versuchen, ist das Drucken den Namen einer Variablen. Natürlich wird dies nicht empfohlen. Wenn Sie dies wirklich tun möchten, sollten Sie einen Blick auf diesen Beitrag werfen: How can you print a variable name in python?

Was ich tun würde, ist, den Namen des Wörterbuchs innerhalb der Listen zu speichern. Du könntest dies tun, indem du 'Leute = [sam, dave]' zu 'Menschen = [["sam", sam], ["dave", dave]] änderst. Auf diese Weise ist Person [0] der Name der Person und Person [1] enthält die Information.

2

Der einfachste Weg ist, den Namen als Zeichenfolge zu speichern, die mit dem passenden Variablenbezeichner Karten:

people = {'sam':sam, 'dave':dave} 

for name, person in people.items(): 
    for key, value in sorted(person.items()): 
     print(name + "'s favorite " + key + " is " + value + ".") 

Wenn Sie wirklich nicht, wie die Idee, jeden Namen zweimal eingeben, könnten Sie ‚inline‘ die Wörterbücher:

people = { 
    'sam':{ 
     'food' : 'tortas', 
     'country' : 'mexico', 
     'song' : 'Dream On', 
    }, 
    'dave':{ 
     'food' : 'spaghetti', 
     'country' : 'USA', 
     'song' : 'Sweet Home Alabama', 
    } 
} 

Schließlich, wenn Sie auf diese Variablen in den globalen Namensraum verlassen können und mehr sind mehr mit nur macht es als Reinheit der Praxis funktioniert, können Sie sie auf diese Weise finden:

people = ['sam', 'dave'] 

for name in people: 
    person = globals()[name] 
    for key, value in sorted(person.items()): 
     print(name + "'s favorite " + key + " is " + value + ".") 
0

Danke für den tollen Input. Dieses Programm ist ein praktisches Beispiel in "Python Crash Course" von Eric Matthes, daher ist das ineffiziente "Dictionary Inside List" -Format beabsichtigt. Das heißt, ich habe eine Menge aus Ihren Kommentar und verändern meinen Code, um die gewünschte Ausgabe zu erhalten:

sam = { 
    #Added a 'name' key-value pair. 
    'name' : 'sam', 
    'food' : 'tortas', 
    'country' : 'mexico', 
    'song' : 'Dream On', 
    } 
dave = { 
    'name' : 'dave', 
    'food' : 'spaghetti', 
    'country' : 'USA', 
    'song' : 'Sweet Home Alabama', 
    } 

people = [sam, dave] 

for person in people: 
    for key, value in sorted(person.items()): 
     #Added if statement to prevent printing the name. 
     if key != 'name': 
      print(person['name'].title() + "'s favorite " + key + " is " + value + ".") 
    #Added a blank line at the end of each for loop. 
    print('\n') 

Hier ist die Ausgabe:

Sam's favorite country is mexico. 
Sam's favorite food is tortas. 
Sam's favorite song is Dream On. 


Dave's favorite country is USA. 
Dave's favorite food is spaghetti. 
Dave's favorite song is Sweet Home Alabama. 

Nochmals vielen Dank, alle, die aufschlussreichen Antworten zur Verfügung gestellt.

Verwandte Themen