Wieder reduce

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.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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().
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Laut Python-Documentation entspricht |= aber update. Oder liege ich da falsch?
MfG
HWK
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Trotzdem muss bei ``x |= set(y)`` erst ein neues Set aus dem Iterable `y` erstellt werden; bei update(y) nicht.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Tatsächlich. Danke für die Info.
MfG
HWK
Antworten