2016-10-26 2 views
0

Ich beginne zu verstehen und zu implementieren Wörterbuchkompromiss. Ich versuche, ein Wörterbuch mit verschachtelten Wörterbücher wie folgt zu erstellen:Python-Wörterbuch der Wörterbücher Verständnis mit verschachtelten Schleifen

{serviceA: {ip_server1: flag, ip_server2: flag ...}, {serviceB ip_server1: Flagge, ip_server_2: flag ... etc}}

Ich habe Probleme, es zu bauen, als wenn ich das Ergebnis bekomme Es wirft mich nur das letzte Element. Ich habe viele Wege ausprobiert und alle haben den gleichen Weg. Hier ist der Code, den ich verwendet:

DICTIONARY 1:

services_dict = {key_service: value for key_service,value in config_file.iteritems() if key_service.startswith("s-")} 
#It returns a dictionary in this form {service1: [list_of_flags]} 

Dann habe ich eine externe Liste, die die Server-IP-Adressen

server_list = [S1, S2, S3, S4 hat .. etc]

Danach ich dic Verständnis zu bauen das komplette Wörterbuch verwenden möchten:

new_services_dict = { key1: {key2:fl} for key1, flag_list in corrected_dict.items() for key2, fl in zip(server_list, flag_list)} 

Das Problem ist, dass es nur das letzte Element der IP-Liste zurückgibt (1 Element nur)

{ 'ServiceA': { 'last_server_ip_in_list': 'Last_flag_in_list'}}

Ich bin nicht sicher, warum es keine neuen Werte hinzufügt und nur das letzte Element in der Iteration nimmt.

Jede Hilfe würde sehr geschätzt werden. Ich habe schon viele Wege ausprobiert und kann nicht herausfinden, welchen Teil der Iteration ich vermisse.

INFO AKTUALISIERT

Wie unten hier im coment angeforderten einige Beispieldaten, die Frage zu klären: Let sagen wir eine Liste von Studenten zur Karte, die ich aus einem Wörterbuch getrennt haben, die enthält der College Probanden mit den Qualitäten:

services_dict = {math: [ 'A', 'B', 'C', 'D'], Datenbanken: [ 'B', 'C', 'D' , 'A']} Schülerliste = ['Jhon', 'Michael', 'Leslie', 'Lorraine']

Die Noten sind jeweils aus der Schülerliste aufgeführt, so dass das nicht das Problem ist (zu welcher Klasse gehört).

Was beabsichtigt ist, ein Wörterbuch in Form zu bekommen:

{ 'Mathematik': { 'Jhon': 'A', 'Michael': 'B', 'Leslie': 'C ',' Lorraine ':' D '}, Datenbanken: {' Jhon ':' B ',' Michael ':' C ',' Leslie ':' D ',' Lorraine ':' A '}}

Das Problem, das ich bekommen habe ist, dass new_services_dict nur zurückkehrt:

{ 'Mathematik: {' Lorraine ':' D '}

Ich hoffe, dies klarer als die Erklärung oben.

+2

Meine erste Vermutung wäre, dass 'Schlüssel1' nicht das ist, was Sie denken, dass es ist und sie alle den gleichen Wert haben, so dass Sie mit einem Eintrag enden. Veröffentlichen Sie einige Beispieldatenstrukturen für corrected_dict, server_list und flag_list, um herumzustöbern. – sberry

+0

Ich habe die Frage mit einem Beispiel aktualisiert. Hoffe, das ist klarer. Wie auch immer, die Antwort unten funktioniert gut. – Pines

Antwort

1

Gut für den Anfang, es sieht aus wie alle Schlüssel in new_services_dict wird das gleiche sein, da Sie eine geschachtelte for-Schleife und nicht ein geschachteltes Wörterbuch Verständnis haben, die ich nehme, was Sie wollen.

Zum Beispiel

>>>{k1:{k2:v} for k1 in ['a','b'] for k2,v in zip(['aa','bb'],[1,2])} 
{'b': {'bb': 2}, 'a': {'bb': 2}} # dictionaries are unordered 

Hier k1 nimmt Wert von 'a' dann bis k2,v for-Schleife durchläuft alle Elemente Pausen vor der Wiederaufnahme. Dies schreibt k1 zu {'bb':2} nur neu, da das das letzte Element in der k2 Iteration ist. Das ist der Grund, warum all Ihre Werte wahrscheinlich gleich herauskommen.

Was Sie wahrscheinlich wollen, ist eine verschachtelte Wörterbuch Verständnis, die wie folgt aussehen:

>>>{k1:{k2:v for k2,v in zip(['aa','bb'],[1,2])} for k1 in ['a','b']} 
{'b': {'aa': 1, 'bb': 2}, 'a': {'aa': 1, 'bb': 2}} 

Hier k1 nimmt den Wert von 'a' macht dann eine Pause, bis das verschachtelte Verständnis läuft.

Überprüfen Sie dies für weitere Informationen und bessere Erklärung auf nested comprehensions. Dies ist für Listenkompressen, aber die gleiche Logik gilt.

+0

Hey, das ist großartig, deine Antwort ist großartig. Es hat gut funktioniert. Ich habe diesen Teil des verschachtelten Diktats vermisst. Konkurrenz. Ich würde deine Antwort wählen, aber immer noch nicht genug Punkte jeje. Danke für Ihre Hilfe !! – Pines

Verwandte Themen