Seite 1 von 1

Merge dicts

Verfasst: Mittwoch 13. Dezember 2006, 06:03
von lunas
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

Re: Merge dicts

Verfasst: Mittwoch 13. Dezember 2006, 08:43
von sunmountain
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).

Re: Merge dicts

Verfasst: Mittwoch 13. Dezember 2006, 09:17
von lunas
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

Verfasst: Mittwoch 13. Dezember 2006, 11:04
von rayo
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

Verfasst: Mittwoch 13. Dezember 2006, 11:26
von keppla

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.

Verfasst: Mittwoch 13. Dezember 2006, 12:57
von 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.

Verfasst: Mittwoch 13. Dezember 2006, 13:19
von sunmountain
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 ...

Verfasst: Mittwoch 13. Dezember 2006, 14:29
von lunas
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