Merge dicts

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Hi,

ich möchte gerne 2 directories miteinander verbinden, ohne dabei das dict verändert wird. Nun gibt es zwar die Funktion 'update', aber diese verändert leider das dict.
Das zusammengefügte dict soll an eine Funktion übergeben werden (ich wollte den Umweg über eine temporäre Variable, also eine Zeile Code, sparen).

Code: Alles auswählen

def func( d ):
    print d

a = {'foo':'bar', 'test':'123'}
func( {'new':'item'}.update( a ) )
Das geht so leider nicht... a.update( {...} ) möchte ich nicht nehmen, da sonst a verändert werden würde. Auch

Code: Alles auswählen

func( a + {'new':'item'} )
funktioniert nicht. Hat noch jemand eine Idee?

lunas
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

lunas hat geschrieben:Hi,

ich möchte gerne 2 directories miteinander verbinden, ohne dabei das dict verändert wird. Nun gibt es zwar die Funktion 'update', aber diese verändert leider das dict.
Das zusammengefügte dict soll an eine Funktion übergeben werden (ich wollte den Umweg über eine temporäre Variable, also eine Zeile Code, sparen).

Code: Alles auswählen

def func( d ):
    print d

a = {'foo':'bar', 'test':'123'}
func( {'new':'item'}.update( a ) )
Das geht so leider nicht... a.update( {...} ) möchte ich nicht nehmen, da sonst a verändert werden würde. Auch

Code: Alles auswählen

func( a + {'new':'item'} )
funktioniert nicht. Hat noch jemand eine Idee?

lunas

Code: Alles auswählen

func(dict([(k,v) for k,v in a.iteritems()]+[['new','item']]))
Du sparst aber nur eine temporäre Variable ...

Die ...update(),...append() etc. Methoden liefern immer None
zurück, kein neues Objekt, deswegen funktioniert Dein Code
auch nicht.
Das "Anhängen" von Listen mit + ist aber ein Ausdruck der einen
Wert entsprechend der Summanden (hier 2 Listen) liefert (auch
eine Liste).
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

sunmountain hat geschrieben:

Code: Alles auswählen

func(dict([(k,v) for k,v in a.iteritems()]+[['new','item']]))
Du sparst aber nur eine temporäre Variable ...
Ja, das war auch meine Absicht. Allerdings werde ich zu Gunsten der Übersichtlichkeit diese Zeile Code dem Script doch spendieren... Dein Beispiel scheint *mir* nicht wirklich offensichtlich (nix für ungut). Ich dachte eben nur, dass es eine einfache (z.B. eben durch Addition oder eine mir unbekannte Funktion) Möglichkeit des Zusammenfügens gibt...

Trotzdem Danke,
lunas
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Warum die sinnlose Iterierung über a.iteritems() bei dem du nichts mit den Daten machst?

Code: Alles auswählen

func(dict(a.items()+[('new','item')]))
Gruss
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Code: Alles auswählen

func( {'new':'item'}.update( a ) )
Das funktioniert nicht, weil update None zurückgibt.

ich persönlich würde es so machen:

Code: Alles auswählen

b = a.copy()
b.update( {'new':'item'} )

func(b)
sind zwar mehr zeilen, ist aber absolut verständlich, und imho deshalb zu bevorzugen.
BlackJack

Und noch eine funktionale Variante:

Code: Alles auswählen

from itertools import chain

def func(d):
    print d

def main():
    a = { 'eric': 'viking' }
    func(dict(chain(a.iteritems(), [('answer', 42)])))
Aber ich würde auch einen temporären Namen benutzen.
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

rayo hat geschrieben:Hi

Warum die sinnlose Iterierung über a.iteritems() bei dem du nichts mit den Daten machst?

Code: Alles auswählen

func(dict(a.items()+[('new','item')]))
Gruss
Wenn ich das wüsste ...
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

keppla hat geschrieben:

Code: Alles auswählen

func( {'new':'item'}.update( a ) )
Das funktioniert nicht, weil update None zurückgibt.
Ich weiß... Wollte auch nur einen kontroversen Denkanstoß geben.
keppla hat geschrieben: ich persönlich würde es so machen:

Code: Alles auswählen

b = a.copy()
b.update( {'new':'item'} )

func(b)
sind zwar mehr zeilen, ist aber absolut verständlich, und imho deshalb zu bevorzugen.
Jap. So habe ich es letztendlich auch gemacht... Sind zwar mehr Zeilen, aber auf den ersten Blick ist ersichtlich was passiert.

Danke trotzdem an alle Beteiligten.

lunas
Antworten