*
ist der "splat" -Operator: Er nimmt eine Liste als Eingabe und erweitert sie im Funktionsaufruf zu tatsächlichen Positionsargumenten.
Also wenn uniqueCrossTabs
ja [ [ 1, 2 ], [ 3, 4 ] ]
, dannitertools.chain(*uniqueCrossTabs)
ist das dasselbe wie zu sagenitertools.chain([ 1, 2 ], [ 3, 4 ])
Dies unterscheidet sich offensichtlich von der gerechten Übergabe uniqueCrossTabs
. In Ihrem Fall haben Sie eine Liste von Listen, die Sie reduzieren möchten. Wasitertools.chain()
geben einen Iterator über die Verkettung aller Positionsargumente zurück, die Sie an ihn übergeben, wobei jedes Positionsargument für sich iterierbar ist.
Mit anderen Worten, Sie möchten jede Liste uniqueCrossTabs
als Argument übergeben chain()
, das sie miteinander verkettet, aber Sie haben die Listen nicht in separaten Variablen, also verwenden Sie die*
Operator, um die Liste der Listen in mehrere Listenargumente zu erweitern.
Wie Jochen Ritzel in den Kommentaren ausgeführt hat, chain.from_iterable()
ist es für diese Operation besser geeignet, da zunächst eine einzige Iterable von Iterablen angenommen wird. Ihr Code wird dann einfach:
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))