Tupel von Paaren ohne dict entpacken

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
doppelkeks
User
Beiträge: 12
Registriert: Sonntag 14. Februar 2010, 22:28

Hallo allerseits,

Ist es möglich, Tupel von Paaren zu entpacken, ohne vorher ein dict daraus zu machen?
Öfters baue ich in solchen Situation ein dict einfach nur, um es sofort wieder zu entpacken.
In längeren Schleifen könnte sich der Overhead von der Erzeugung der dicts auf eine relevante Größe summieren.

Code: Alles auswählen

>>> def f(a=0, b=0):
...    return "a: {}, b: {}".format(a,b)
...
>>> names = ('a', 'b')
>>> values = (1, 2)

# das klappt natürlich
>>> f(**dict(zip(names, values)))
'a: 1, b: 2'

# das geht nicht
>>> f(**zip(names, values))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: f() argument after ** must be a mapping, not list

# das natürlich auch nicht
>>> f(*zip(names, values))
"a: ('a', 1), b: ('b', 2)"

# das ist einfach nur krank. Geht auch nur mit unveränderbaren Typen wie str, int, tuple
>>> eval("f({})".format(",".join(map(lambda a,b: "{}={}".format(a,b), names, values))))
'a: 1, b:2'
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Suchst du einfach nur das?

Code: Alles auswählen

t = 23, 42
f(*t)
Sonst stellt sich die Frage: Was genau hast du vor? So eine Situation hatte ich nämlich noch nie.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um was geht es dir denn genau? Funktionen mit Keyword-Argumenten zu fuettern oder um das Auspacken von Tupeln?

Fuer letzteres siehe EyDu, fuer ersteres kann ich mir nicht vorstellen wie man zu Dictionaries bzw Paarlisten kommt die laenger als 10 sind (womit der 1. Aufruf kein grosser Overhead ist).
doppelkeks
User
Beiträge: 12
Registriert: Sonntag 14. Februar 2010, 22:28

Ich habe mich einfach gefragt, ob ich eine Funktion mit kwargs aus Tupeln füttern kann, ohne unbedingt ein dict bauen zu müssen, welches dann entpackt wird.

Das könnte ich beispielsweise beim wiederholten Einlesen von csv Dateien brauchen.
Die können u.U. groß sein - viele Zeilen, viele Spalten.
Ich kann mich nicht darauf verlassen, dass die Reihenfolge der Spalten bei jeder Datei immer gleich ist, daher nehme ich **kwargs statt positionelle *args in meinen "object_from_row"-Factories.

Natürlich ist es jetzt nicht so schwer die Spaltenreihenfolge zu kontrollieren und ggf. umzusortieren, aber ich bin ein Freund von schlichter Eleganz :-)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@doppelkeks: wenn Geschwindigkeit Dein Problem ist, dann solltest Du zuerst einmal schauen, wo die meiste Zeit verwendet wird. Höchstwahrscheinlich nicht beim Generieren von Dicts. Bei großen Datenmengen ist vielleicht numpy eine Lösung
doppelkeks
User
Beiträge: 12
Registriert: Sonntag 14. Februar 2010, 22:28

Zugegeben, so groß sind die Kosten von dicts nicht. Hauptsächlich hat es meine Neugier geweckt.
Antworten