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

Wieder reduce

Beitragvon HWK » Samstag 23. Juni 2007, 12:22

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

Beitragvon mitsuhiko » Samstag 23. Juni 2007, 13:51

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

Beitragvon HWK » Samstag 23. Juni 2007, 14:20

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

Re: Wieder reduce

Beitragvon birkenfeld » Samstag 23. Juni 2007, 14:30

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

Beitragvon HWK » Samstag 23. Juni 2007, 22:00

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

Beitragvon birkenfeld » Samstag 23. Juni 2007, 22:27

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

Beitragvon HWK » Sonntag 24. Juni 2007, 10:44

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder