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
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
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?
Gruss
Verfasst: Mittwoch 13. Dezember 2006, 11:26
von keppla
Das funktioniert nicht, weil update None zurückgibt.
ich persönlich würde es so machen:
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?
Gruss
Wenn ich das wüsste ...
Verfasst: Mittwoch 13. Dezember 2006, 14:29
von lunas
keppla hat geschrieben:
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:
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