16

Ich habe Probleme beim Verständnis von verschachtelten Wörterbuch-Comprehensions in Python 3. Das Ergebnis, das ich aus dem folgenden Beispiel bekomme, gibt die korrekte Struktur ohne Fehler aus, aber enthält nur eine der inneren Schlüssel: Wert-Paare. Ich habe kein Beispiel für ein verschachteltes Wörterbuchverständnis gefunden. Googling "Nested Dictionary Comprehension Python" zeigt Legacy-Beispiele, nicht verschachtelte Comprehensions oder Antworten, die mit einem anderen Ansatz gelöst wurden. Ich verwende möglicherweise die falsche Syntax.Nested Wörterbuch Verständnis Python

Beispiel:

data = {outer_k: {inner_k: myfunc(inner_v)} for outer_k, outer_v in outer_dict.items() for inner_k, inner_v in outer_v.items()} 

Dieses Beispiel sollte das ursprüngliche Wörterbuch zurück, sondern mit dem inneren Wert von myfunc modifiziert.

Struktur des outer_dict Wörterbuch sowie das Ergebnis:

{outer_k: {inner_k: inner_v, ...}, ...} 

Antwort

20

{inner_k: myfunc(inner_v)} ist kein Wörterbuch Verständnis. Es ist nur ein Wörterbuch.

Du bist wahrscheinlich für so etwas wie diese statt suchen:

data = {outer_k: {inner_k: myfunc(inner_v) for inner_k, inner_v in outer_v.items()} for outer_k, outer_v in outer_dict.items()} 

Aus Gründen der Lesbarkeit nicht nisten Wörterbuch Comprehensions und Listenkomprehensionen zu viel.

+1

Vielen Dank - wenn das jemandem hilft, hier ist ein Punkt, der mich verwirrte: Blenders Lösung hat zwei Änderungen von meinem Ex: eine bewegte Klammer, und setzen das innere 'für' vor dem äußeren. Ich hatte ursprünglich die for-Klausel richtig gesetzt, aber mit der Klammer an der falschen Stelle, wurde "NameError: globaler Name 'äußere_v" ist nicht definiert. "Dann der gleiche Fehler mit der' for 's an der falschen Stelle mit der Klammer in der richtiger Platz –

20

Hinzufügen einiger Zeilenumbrüche und Einzüge:

data = { 
    outer_k: {inner_k: myfunc(inner_v)} 
    for outer_k, outer_v in outer_dict.items() 
    for inner_k, inner_v in outer_v.items() 
} 

... macht es offensichtlich, dass Sie tatsächlich ein einziges haben "2-dimensionales" dict Verständnis. Was Sie wirklich wollen, ist wahrscheinlich:

data = { 
    outer_k: { 
     inner_k: myfunc(inner_v) 
     for inner_k, inner_v in outer_v.items() 
    } 
    for outer_k, outer_v in outer_dict.items() 
} 

(das ist genau das, was Blender in seiner Antwort vorgeschlagen, mit zusätzlichen Leerzeichen).

+0

Auch sehr hilfreich.Ich werde in Vergleich dies mit der Verwendung einer dict comp für 1 Achse innerhalb einer for-Schleife, sowie der beste Weg, um es nach Linie, ästhetisch zu brechen. –

Verwandte Themen