Ich hoffe, dass mir jemand mit einem Problem helfen kann, bei dem ich feststecke. Ich habe eine große Anzahl von Tupeln (& gt; 500), die wie folgt aussehen:
%Vor%Ein Ausschnitt meines Codes lautet:
%Vor%Mir ist klar, dass der obige Code nicht korrekt ist. Ich versuche einen Weg zu finden, alle Werte A zusammen zu addieren, alle Werte von B zusammen, alle Werte von C zusammen und alle Werte von D zusammen mit der Zip-Funktion. Zum Beispiel möchte ich etwas drucken, das so aussieht:
%Vor%Kann jemand bitte helfen? Vielen Dank für Ihre Zeit.
Um dies mit einem beliebig großen Satz von Tupeln zu tun:
%Vor%sidenote: Beachten Sie in Python3, dass zip ein lazerisches iterable zurückgibt, das Sie immer explizit in eine Liste umwandeln können, wie jede andere Art von iterable: list (zip (...))
(Danke an Seganku für den Fehler in Beispielen in einem Schnitt zu fangen was von anderen Redakteuren dreimal abgelehnt wurde)
Der erste Aufruf, in zip
, invertiert die Listen - erstellt eine Liste aller ersten Elemente, aller zweiten Elemente usw.
Der zweite Aufruf, map
, ruft sein erstes Argument sum
auf seinem zweiten Argument auf, diese Listen, und gibt eine Liste der Ergebnisse von sum
zurück - was zufällig die Summe ist.
Wenn Ihre Sets alle dieselbe Größe haben und Sie in C Python arbeiten, sollten Sie numpy in Erwägung ziehen. Sie können dies wie folgt tun:
%Vor%Numpy konvertiert Ihre Werte in ein Array und arbeitet mit ihnen effizient mit optimierten LAPACK-Funktionen.
Um Leistung zu vergleichen, profilierte ich unter zwei Annahmensätzen. In der ersten nehme ich an, dass Ihre Daten so gespeichert werden, dass der Import in ein Numpy-Array effizient ist. Daher habe ich die Zeit, die zum Konvertieren von Sets in ein Array benötigt wird, nicht berücksichtigt. Ich habe die Leistung von np.sum mit [sum (x) für x in zip (* sets)] verglichen. Hier sind die Zeit-Ergebnisse für jeden Fall:
%Vor%Die Schlussfolgerung ist, dass numpy schneller ist, wenn Ihre Eingabedaten einfach mit numpy importiert werden können.
Wenn Sie alle Tupel in einer Liste haben, können Sie reduce()
: