Problem mit summen in tupeln

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.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Problem mit summen in tupeln

Beitragvon jo_hb » Montag 11. Juni 2007, 11:25

Hallo,
hat jemand ne idee wie ich das folgende mache? (Nein, ist keine Hausaufgabe, aber ich komm trotzdem nicht drauf... :)

ich habe eine Liste mit tupeln, etwa wie folgt:

Code: Alles auswählen

a = [ (4,4),
        (1,10),
        (7,7),
        (10,10)]


Und es sollen jetzt summen gebildet werden, und zwar so, dass immer wenn ein tupel (1,10) auftaucht beide varianten berechnet werden, also einmal +1, einmal +10 - im obigen Beispiel sollte also [22, 31] herrauskommen, wenn mehr (1, 10) tupel auftauchen sollen auch entsprechend mehr Summen rauskommen.

Gruss,
Jo
thelittlebug
User
Beiträge: 187
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Beitragvon thelittlebug » Montag 11. Juni 2007, 11:45

hi,

warscheinlich weiß blackjack noch ne schönere lösung :)
aber hier mal meine

Code: Alles auswählen

>>> a=[(4,4),(1,10),(7,7),(10,10)]
>>> (sum([x[0] for x in a]), sum(x[1] for x in a))
(22, 31)
>>>
BlackJack

Beitragvon BlackJack » Montag 11. Juni 2007, 11:47

Ein Anwendungsfall für `reduce()`:

Code: Alles auswählen

In [11]: a = [(4, 4), (1, 10), (7, 7), (10, 10)]

In [12]: reduce(lambda (a, b), (c, d): (a + c, b + d),
   ....:        a,
   ....:        (0, 0))
Out[12]: (22, 31)
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Beitragvon jo_hb » Montag 11. Juni 2007, 11:48

Blackjack, je genau, hehe...
Also vielen Dank, das sieht schon um einiges besser aus als meine bisherigen kläglichen Versuche, die nie unter 15 Zeilen kamen... :)

Jo
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 11. Juni 2007, 12:04

Ein klarer Anwendungsfall für zip:

Code: Alles auswählen

>>> a = [(4,4),(1,10),(7,7),(10,10)]
>>> map(sum, zip(*a))
[22, 31]
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 11. Juni 2007, 12:53

Und jetzt benchmarken wir mal die zip-Lösung gegen die reduce-Lösung... ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 11. Juni 2007, 12:55

Hi Blackbird,

hätte ich auch gesagt. Aber da Du nicht darauf hinwiest, dass zip erst eine neue Liste erzeugt, was bei großen Teillisten immense Ressourcen frisst, warte ich auf eine entsprechende Bemerkung von Blacky (Blackjack). ^^

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 11. Juni 2007, 12:57

birkenfeld hat geschrieben:Und jetzt benchmarken wir mal die zip-Lösung gegen die reduce-Lösung... ;)

... ok, Birkenfeld war schneller. :lol:

Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 11. Juni 2007, 13:06

birkenfeld hat geschrieben:Und jetzt benchmarken wir mal die zip-Lösung gegen die reduce-Lösung... ;)


premature optimization is the root of all evil
;-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 11. Juni 2007, 13:26

Wenn ich von Haus aus den schnelleren Algorithmus nehme, ist das ja noch keine Optimierung...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 11. Juni 2007, 13:40

Code: Alles auswählen

reduce_method 2.22972607613
map_method 1.34840607643
imap_method 1.23970103264

sogar map ist schneller als reduce.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 11. Juni 2007, 13:43

Ich hab nie gesagt, was ich nehmen würde... :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Montag 11. Juni 2007, 14:05

Man könnte blackbirds Code auch mit izip und einer GE umsetzen.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 11. Juni 2007, 14:10

Jetzt wo's eh schon so absurd ist:

Code: Alles auswählen

from time import time
from itertools import izip, imap
from random import randrange

TESTDATA = [(randrange(100), randrange(100)) for x in range(500)]

def runtest(t):
    s = time()
    for x in xrange(10000):
        a, b = t(TESTDATA)
    return time() - s

def reduce_method(a):
    return reduce(lambda (a, b), (c, d): (a + c, b + d), a, (0, 0))

def map_method(a):
    return map(sum, zip(*a))

def imap_method(a):
    return imap(sum, izip(*a))

def izip_in_ge_method(a):
    return (sum(x) for x in izip(*a))

for name, test in sorted(locals().items()):
    if name.endswith('_method'):
        print name[:-7], runtest(test)

Ergibt:

Code: Alles auswählen

imap 1.37107610703
izip_in_ge 1.53157806396
map 1.60974383354
reduce 3.47407388687
TUFKAB – the user formerly known as blackbird
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 11. Juni 2007, 14:19

birkenfeld hat geschrieben:Wenn ich von Haus aus den schnelleren Algorithmus nehme, ist das ja noch keine Optimierung...


Willst du damit sagen, dass du optimierst, ohne zu prüfen ob die Optimierung auch schneller ist ;-) ?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder