Seite 1 von 1

Wieder reduce

Verfasst: Samstag 23. Juni 2007, 12:22
von HWK
Seitdem ich gelesen habe, dass reduce verschwinden soll, brauche ich es immer häufiger. Ich möchte jetzt z.B. mehrere Listen in eine geordnete zusammenfassen, in der jeder Wert nur einmal vorkommt. Mit reduce habe ich diese Variante gefunden:

Code: Alles auswählen

a = [[1, 5, 7], [9, 2, 6], [7, 8, 1]]
print sorted(reduce(lambda x, y: x | y, map(set, a), set()))
Ohne reduce habe ich es nur so hinbekommen:

Code: Alles auswählen

a = [[1, 5, 7], [9, 2, 6], [7, 8, 1]]
b = set()
for x in a:
    b |= set(x)
print sorted(b)
Findet jemand eine schönere, möglichst funktionale Lösung?
Danke
HWK

Verfasst: Samstag 23. Juni 2007, 13:51
von mitsuhiko

Code: Alles auswählen

from itertools import chain
a = [[1, 5, 7], [9, 2, 6], [7, 8, 1]]
print sorted(set(chain(*a)))
//EDIT: und reduce verschwindet nicht, es ist nur kein builtin mehr. Du findest es im functools modul.

Verfasst: Samstag 23. Juni 2007, 14:20
von HWK
Man müsste sich halt besser in der Standard-Library auskennen. Danke Blackbird.
Dein Edit beruhigt mich auch etwas. Denn manchmal ist reduce meiner Meinung nach doch hilfreich.
MfG
HWK

Re: Wieder reduce

Verfasst: Samstag 23. Juni 2007, 14:30
von birkenfeld
HWK hat geschrieben:Seitdem ich gelesen habe, dass reduce verschwinden soll, brauche ich es immer häufiger. Ich möchte jetzt z.B. mehrere Listen in eine geordnete zusammenfassen, in der jeder Wert nur einmal vorkommt. Mit reduce habe ich diese Variante gefunden:

Code: Alles auswählen

a = [[1, 5, 7], [9, 2, 6], [7, 8, 1]]
print sorted(reduce(lambda x, y: x | y, map(set, a), set()))
Ohne reduce habe ich es nur so hinbekommen:

Code: Alles auswählen

a = [[1, 5, 7], [9, 2, 6], [7, 8, 1]]
b = set()
for x in a:
    b |= set(x)
print sorted(b)
Findet jemand eine schönere, möglichst funktionale Lösung?
Trotzdem blackbird schon eine sinnvolle Lösung gepostet hat, muss ich hier nochmal einhaken, dass die for-Schleife unnötige Sets erstellt. Viel besser nutzt man hier set.update().

Verfasst: Samstag 23. Juni 2007, 22:00
von HWK
Laut Python-Documentation entspricht |= aber update. Oder liege ich da falsch?
MfG
HWK

Verfasst: Samstag 23. Juni 2007, 22:27
von birkenfeld
Trotzdem muss bei ``x |= set(y)`` erst ein neues Set aus dem Iterable `y` erstellt werden; bei update(y) nicht.

Verfasst: Sonntag 24. Juni 2007, 10:44
von HWK
Tatsächlich. Danke für die Info.
MfG
HWK