Seite 1 von 1

Nicht verschachtelte Listen flatten mit chain() funzt nicht

Verfasst: Dienstag 24. März 2009, 18:47
von Hyperion
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.

Verfasst: Dienstag 24. März 2009, 19:07
von str1442
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]

Verfasst: Dienstag 24. März 2009, 19:22
von Hyperion
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!