Map-Liste von Tupeln in ein Wörterbuch, python
Ich habe eine Liste von Tupeln extrahiert aus einer Tabelle in einer DB, die aussieht wie (Schlüssel , foreignkey , Wert). Es gibt viele zu-eins-Beziehung zwischen dem Schlüssel und foreignkeys und möchte ich es konvertieren in ein dict-indiziert durch den foreignkey mit der Summe aller Werte, mit denen foreignkey, also { foreignkey , sumof( Wert ) }. Ich schrieb etwas, das ziemlich ausführlich:
myDict = {}
for item in myTupleList:
if item[1] in myDict:
myDict [ item[1] ] += item[2]
else:
myDict [ item[1] ] = item[2]
aber nachdem ich diese Frage ist Antwort oder diese zwei es muss ein übersichtlicher Art und Weise auszudrücken, was ich gerne tun würde. Und wenn dies ist eine Wiederholung, habe ich es verpasst, und entfernen Sie die Frage, wenn Sie den link.
- Vielleicht off-topic, aber ich Frage... Warum ist das nicht geschehen, auf der Ebene der DB? Das ist die Art von Sache, die DBMS sind gut...
- Es ist tatsächlich nicht der DB, sondern auf die der Zugriff über eine Schnittstelle, die behandelt Sie wie eine DB. Es ist nur ein Haufen von flachen Dateien.
InformationsquelleAutor wheaties | 2010-02-05
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, alle Ihre Werte sind
int
s, könnte man einedefaultdict
um dies zu erleichtern:defaultdict
ist wie ein Wörterbuch, außer, wenn Sie versuchen, um einen Schlüssel, der nicht da ist, er füllt in der Rückgabewert aufrufbar - in diesem Fallint
, die gibt 0 zurück, wenn ohne Argumente aufgerufen.UPDATE: Dank @gnibbler mich daran erinnert, aber Tupeln können entpackt werden in einer for-Schleife:
Hier, die 3-Elemente-Tupel wird ausgepackt, in die Variablen
_
,key
, undval
._
ist eine gemeinsame Platzhalter name in Python, verwendet, um anzuzeigen, dass der Wert ist nicht wirklich wichtig. Mit diesem können wir vermeiden, dass Sie die haarigeitem[1]
unditem[2]
Indizierung. Wir können nicht auf diese angewiesen sind, wenn die Tupel inmyTupleList
sind nicht alle die gleiche Größe, aber ich Wette, Sie sind.(Wir haben auch die situation vermeiden, dass jemand den code betrachten und denken, es ist kaputt, weil der Autor dachte, arrays wurden 1-indiziert, das ist, was ich dachte, wenn ich zuerst Lesen Lesen Sie den code. Ich war nicht gelindert, bis ich Lesen die Frage. In der obigen Schleife, aber es ist offensichtlich, dass
myTupleList
ist ein Tupel mit drei Elementen, und wir brauchen nicht die erste.)myDict = reduce(lambda d, t: (d[t[1]] += t[2], d)[1], myTupleList, defaultdict(int))
- Sie wissen, jeder sollte nutzen senken! big grinreduce
verdunkelt. Und meine Lösung ist etwas sowieso falsch, aber ich poste in der richtigen version._,
vorkey
, also +1.myTupleList
ist ein drei-Tupel-element. Sie erhaltenValueError: too many values to unpack
.Hier ist meine (Zunge, Wange) Antwort:
Es ist hässlich und schlecht, aber hier ist, wie es funktioniert.
Das erste argument zu verringern (denn es ist nicht klar, es) ist
lambda d, t: (d.__setitem__(t[1], d.get(t[1], 0) + t[2]), d)[1]
. Ich werde später darüber sprechen, aber für jetzt, ich ' ll nennen es einfachjoe
(keine Beleidigung an irgendwelche Leute namens Joe soll). Die senken-Funktion funktioniert im Prinzip so:... Und das ist für eine drei-element-Liste. Wie Sie sehen können, es ist im Grunde verwendet das erste argument Art von sammeln jedes Ergebnis in die endgültige Antwort. In diesem Fall, die Letzte Antwort ist das Wörterbuch, das Sie wollte.
Nun für
joe
selbst. Hier istjoe
alsdef
:Leider keine form der
=
oderreturn
durfte in Pythonlambda
so zu bekommen, um. Ich bekomme um die fehlende=
durch den Aufruf derdict
s__setitem__
Funktion direkt. Ich bekomme um die fehlende Rückkehr in durch die Schaffung eines Tupels mit der return-Wert von__setitem__
und das Wörterbuch, und dann wieder die Tupel-element mit dem Wörterbuch. Ich werde langsam verändernjoe
so können Sie sehen, wie ich das bewerkstelligen.Entfernen Sie zuerst die
=
:Weiter, machen Sie den gesamten Ausdruck zu evaluieren, um den Wert, den wir zurückgeben möchten:
Habe ich in diesem use-case, für
reduce
unddict
viele Male in meinem Python-Programmierung. Meiner Meinung nachdict
könnte verwenden Sie eine member-Funktionreduceto(keyfunc, reduce_func, iterable, default_val=None)
.keyfunc
würde den aktuellen Wert aus den wiederholenden und den Schlüssel zurückzugeben.reduce_func
würde nehmen Sie den vorhandenen Wert in das dictionary und den Wert aus der iterierbar und der neue Wert wird zurückgegeben für das Wörterbuch.default_val
wäre, was übergeben wurde, inreduce_func
wenn das Wörterbuch fehlt ein Schlüssel. Der Rückgabewert sollte das Wörterbuch selbst, so konnten Sie Dinge tun, wie:dict
interface würde, dass Situationen wie diese viel einfacher zu handhaben.Vielleicht nicht genau lesbar, aber es sollte funktionieren:
Der ersten Zeile findet alle einzigartig Fremdschlüssel. Die zweite Zeile baut Ihr Wörterbuch, indem Sie zuerst konstruieren eine Liste von (fk, sum(alle Werte für diese fk))-paar und drehen, dass in einem Wörterbuch.
Blick auf SQLAlchemy und sehen, ob das funktioniert die Zuordnung, die Sie benötigen und vielleicht mehr