Nicht verschachtelte Listen flatten mit chain() funzt nicht

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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo zusammen,

ich hab grad nen Brett vorm Kopf:

Code: Alles auswählen

In [57]: list(imap(partial(sample, xrange(10)), (4, 2)))
Out[57]: [[4, 0, 6, 8], [2, 8]]

In [58]: list(chain(imap(partial(sample, xrange(10)), (4, 2))))
Out[58]: [[2, 6, 3, 7], [2, 1]]
Wieso glättet das chain() nicht die beiden Listen? Wie man an [57] erkennt, liefert das imap() doch 2 Listen zurück. Daher sollte das chain doch diese Elemente einzeln zurückgeben.

Ich hätte jetzt folgendes erwartet:

Code: Alles auswählen

[2, 6, 3, 7, 2, 1]
Bin verwirrt :?

Ich verwende Python 2.6 btw.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

imap() erzeugt einen Iterator über Listen, chain erwartet einzelne Listen als Argument. Du musst als die Argumente mit dem einzelnen Sternchen äh... "unfolden" (Heisst das so? Schwirrte mir grade zu der Sternchen-Syntax im Kopf herum).

Code: Alles auswählen

In [37]: list(chain(*imap(partial(sample, xrange(10)), (4, 2)))) 
Out[37]: [2, 6, 3, 1, 1, 9]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ah ... danke Dir!

Ich hab daraufhin mir die Doku noch einmal genau angeguckt und dann direkt darunter ja dies entdeckt:

Code: Alles auswählen

In [82]: list(chain.from_iterable(imap(partial(sample, xrange(10)), (4, 2))))
Out[82]: [3, 8, 1, 2, 5, 6]
mit from_iterables() wird eben genau mein Fall abgedeckt!
Antworten