Python: tief an das Wörterbuch angehängt? - in einem einzigen Ausdruck

8

Wie bekomme ich in einem einzelnen Ausdruck ein Wörterbuch? wo ein Schlüssel-Wert-Paar zu einem Unterwörterbuch hinzugefügt wurde in einigen Eingabewörterbüchern? Das Eingabewörterbuch sollte unverändert bleiben. Es Es kann davon ausgegangen werden, dass das Sub-Dictionary existiert und dass das neue Schlüssel-Wert-Paar noch nicht im Sub-Dictionary vorhanden ist.

Update 2 (Definition von "SOsurvivalConditions", siehe unten):

Der prägnanteste Weg ist:

%Vor%

Update 1 :

Dies entspricht den gegebenen Anforderungen und hat nicht die Nebeneffekt der Änderung des Eingabewörterbuchs:

%Vor%

Jedoch kann der prägnanter (aber nur Aussage) Weg mit einer Hilfsfunktion angepasst werden, z.B.:

%Vor%

Das Beispiel:

%Vor%

'firstCondition' in SOsurvivalConditions hat jetzt zwei Schlüssel / Wert-Paare. Ein neues Schlüssel / Wert-Paar ("Synonym", "Eine moderne Form von RTFM ist: Google It."), muss angehängt werden und das Ergebnis sollte in einem einzelnen Ausdruck verfügbar sein.

Das funktioniert (eine Zeile, aber in mehrere gebrochen):

%Vor%

und gibt zurück:

%Vor%

Allerdings gibt es hier eine Menge Redundanz Ausdruck - alle Schlüssel werden wiederholt. Und "FirstCondition" erscheint zweimal. Gibt es mehr elegante Art und Weise?

(Die Namen und der Inhalt der Datenstrukturen hier sind zusammengesetzt, stellen aber ein echtes Problem dar, auf das ich heute gestoßen bin. Python-Version: 2.6.2.).

    
Peter Mortensen 05.07.2009, 19:33
quelle

6 Antworten

5
%Vor%     
Evan Fosmark 05.07.2009 19:39
quelle
3

Hier ist einer, der Ihre speziellen Spezifikationen erfüllt (innerhalb der Zweideutigkeit, mit der Sie sie spezifiziert haben):

%Vor%

Dies ändert die anfänglichen Datenstrukturen (anstatt neue zu erstellen, wie die Antwort von @ truppo) und ist auch ein Ausdruck, der das gesamte Wörterbuch zurückgibt (anstatt eine Aussage zu sein, wie die Antwort von @ Evan oder die Rückgabe von None, like @ Seth's).

Natürlich sind viele Varianten möglich (wenn Sie möchten, dass der neue Eintrag ein existierendes mit dem gleichen Schlüssel 'synonym' überschreibt, anstatt einen solchen existierenden Eintrag in Ruhe zu lassen, könnten Sie __setitem__ anstelle von setdefault verwenden, Zum Beispiel - es ist schwer zu erraten, was Sie in solchen Fällen tun möchten, da Ihre anfänglichen Spezifikationen so verzweifelt zweideutig sind und es keinen "echten Anwendungsfall" -Kontext gibt, der helfen könnte, sie zu entschlüsseln.

Bearbeiten : Wenn nun der Anwendungsfall in Kommentaren geklärt ist (keine Änderung der ursprünglichen Datenstrukturen, und ein Ausdruck ist in der Tat erforderlich, aber eine Hilfsfunktion wäre in Ordnung), würde ich Folgendes vorschlagen:

%Vor%

und als gewünschten Ausdruck verwenden Sie:

%Vor%

Je nach gewünschtem Verhalten in Eckfällen sind mehrere Varianten möglich. Diese Version fügt ein neues Wörterbuch (mit dem angegebenen inneren Schlüssel / Wert-Paar) hinzu, wenn vorher noch kein Eintrag mit dem angegebenen äußeren Schlüssel vorhanden war; Wenn ein solcher vorheriger Eintrag war, versucht er, es zu einem dict zu machen (selbst wenn es sich z. B. um eine Liste von Schlüssel-Wert-Tupeln handelte), wenn eine Ausnahme nicht möglich ist. Eine strengere Version (die verlangt, dass der innere Eintrag bereits existierte und ein dict- oder dict-ähnliches Objekt war, stattdessen eine Ausnahme auslöst) könnte stattdessen

verwenden %Vor%

als zweite Aussage im Körper.

    
Alex Martelli 05.07.2009 22:21
quelle
2

Suchen Sie nach dict.update (Dokumentation hier )?

%Vor%

ist, was ich denke, du willst.

    
Seth Johnson 05.07.2009 19:39
quelle
1

Python 3 ist dein Freund:

%Vor%

Ein einzelner Zeilenausdruck, der ein Dictionary mit dem zusätzlichen Untereintrag zurückgibt, ohne das ursprüngliche Wörterbuch oder das Unterverzeichnis zu ändern.

    
cdlane 16.08.2016 17:54
quelle
1

Das funktioniert, aber es ist nicht hübsch, und ich denke, Sie gehen wahrscheinlich zu weit mit Ihrem Lambda / Oneliner / was auch immer Sie versuchen zu tun:)

%Vor%     
truppo 05.07.2009 20:11
quelle
1

Ich glaube, das entspricht Ihren Anforderungen:

%Vor%

Dadurch wird ein neues Wörterbuch erstellt, das das innere Wörterbuch des Originals unter firstCondition erstellt und daraus ein neues Wörterbuch mit dem neuen Element erstellt. Eine Einschränkung besteht darin, dass, wenn im ursprünglichen Wörterbuch andere änderbare Strukturen als Wert vorhanden sind, die Referenzen auf das neue Wörterbuch kopiert werden. Das scheint jedoch in Ihrem Problem nicht der Fall zu sein, und Sie können es leicht modifizieren, um auch Kopien dieser veränderbaren Strukturen zu erzeugen.

Hier ist eine Bestätigung, dass das funktioniert:

%Vor%     
Karin 16.08.2016 19:02
quelle

Tags und Links