Reduce

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Dienstag 2. April 2013, 10:49

Es war ironisch gemeint, da wir bis jetzt nur built-ins nachprogrammmiert haben
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Dienstag 2. April 2013, 10:55

Code: Alles auswählen

def bin2dec(binary):
	return reduce(lambda acc,y: acc*2 + y,binary)
Schafft es jemand dec2bin mit reduce zu definieren?
Sirius3
User
Beiträge: 7779
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 2. April 2013, 11:00

wenn schon, dann wenigstens korrekt:

Code: Alles auswählen

def len(iterable):
    return reduce(lambda acc,y: acc+1,iterable, 0)

def bin2dec(binary):
    return reduce(lambda acc,y: acc*2 + {'0':0,'1':1}[y],binary, 0)
BlackJack

Dienstag 2. April 2013, 11:51

Wobei `bin2dec()` ein falscher Name ist. Da wird nichts in Dezimalsystem umgewandelt, sondern eine Binärdarstellung in eine ganze Zahl — wie auch immer die intern oder standardmässig als Zeichenkette dargestellt wird. Also: `bin2int()`. :!:
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Dienstag 2. April 2013, 13:39

@Sirius3 Deine Version nimmt Strings an, meine ganzzahl listen
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Mittwoch 3. April 2013, 12:04

Code: Alles auswählen

def _all(iterable):
	return reduce(lambda acc,y: False if not acc else (True if y else False),
		      iterable,True)

def _any(iterable):
	return reduce(lambda acc,y: True if acc else (True if y else False),
		      iterable,False)
BlackJack

Mittwoch 3. April 2013, 13:33

@fail: Boah, ist das gruselig. Es gibt logische Verknüpfungen und die `bool()`-Funktion.

Code: Alles auswählen

def all_(iterable):
    return reduce(lambda x, acc: acc and bool(x), iterable, True)

def any_(iterable):
    return reduce(lambda x, acc: acc or bool(x), iterable, False)
Wobei das auch wieder nix für den produktiven Einsatz wäre, denn im Gegensatz zu den echten `all()` und `any()` werten diese beiden immer das komplette `iterable` aus, auch wenn das Ergebnis schon unwiderruflich feststeht.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Donnerstag 4. April 2013, 18:20

@BlackJack Reduce ist doch ein left fold daher ist das linke argument der funktion der accumulator?
BlackJack

Donnerstag 4. April 2013, 18:47

@fail: Ich hätte es doch testen sollen. :oops:
Üpsilon
User
Beiträge: 188
Registriert: Samstag 15. September 2012, 19:23
Wohnort: Altschauerberg 8 in 91448 Emskirchen

Montag 6. April 2015, 20:26

Sorry, dass ich das hier wieder ausgrabe, ahaber es ist irre relevant, dass man mit reduce auch Listen sortieren kann. Und dafür braucht man nur eine Zeile, die allerdings völlig unlesbar ist.

Code: Alles auswählen

def sortieren(liste):
    return reduce(lambda acc, i: filter(lambda j: j<=i, acc)+[i]+filter(lambda j: j>i, acc), liste, [])
:D
PS: Die angebotene Summe ist beachtlich.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 7. April 2015, 07:51

Was ist denn dran unlesbar? Das ist eher irre ineffizient, aber ansonsten ist das recht logisch aufgebaut.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Üpsilon
User
Beiträge: 188
Registriert: Samstag 15. September 2012, 19:23
Wohnort: Altschauerberg 8 in 91448 Emskirchen

Montag 4. Mai 2015, 17:16

Mit Reduce kann man auch Geldautomaten programmieren:

Code: Alles auswählen

scheine = [5,10,20,50]

def auszahlen(betrag):
    return reduce(lambda acc, schein: acc + [schein] * ((betrag-sum(acc)) // schein),
        sorted(scheine, reverse=True), [])
    
print auszahlen(135)
PS: Die angebotene Summe ist beachtlich.
Antworten