Sternchen im Funktionsaufruf
Ich bin mit itertools.Kette, "ebnen" eine Liste von Listen in dieser Art und Weise:
uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))
wie ist diese anders als zu sagen:
uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))
- Werfen Sie einen Blick auf Auspacken-argument-Listen in der Python-Dokumentation für weitere Informationen.
- Sie sollten auch prüfen, die
**
Betreiber -- es tut die gleiche Sache wie*
aber mit keyword-Argumenten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
*
ist die "splat" - Betreiber: Es nimmt eine Liste als Eingabe, und dehnt es in die eigentliche positions-Argumente im Funktionsaufruf.Also, wenn
uniqueCrossTabs
war[ [ 1, 2 ], [ 3, 4 ] ]
, dannitertools.chain(*uniqueCrossTabs)
ist die gleiche wie zu sagenitertools.chain([ 1, 2 ], [ 3, 4 ])
Ist dies natürlich anders aus, übergeben Sie in nur
uniqueCrossTabs
. In Ihrem Fall haben Sie eine Liste von Listen, die Sie möchten, zu glätten; wasitertools.chain()
tut, ist zurück einen iterator über die Verkettung aller positions-Argumente übergeben werden, wobei jede positions-argument ist durchsuchbar in seinem eigenen Recht.In anderen Worten, Sie wollen vorbei, dass jede Liste in
uniqueCrossTabs
als argument zuchain()
, die Kette Sie zusammen, aber Sie haben nicht die Listen in separaten Variablen, so dass Sie verwenden die*
Betreiber an, erweitern Sie die Liste von Listen in mehreren Liste Argumente.Als Jochen Ritzel hat darauf hingewiesen, in den Kommentaren,
chain.from_iterable()
ist besser geeignet für diese operation, wie es geht von einem einzigen iterierbar von iterables, um mit zu beginnen. Ihr code wird dann einfach:chain(*it)
würde ich schreibenchain.from_iterable(it)
.from_iterable
existiert! Ich füge Sie in meine Antwort in Kürzeitertools.chain(123, 456)
wird nicht funktionieren, weilint
s sind definitiv nicht iterierbar 😛for l in uniqueCrossTabs:
Durchlaufen Sie. Leider ist es schwer zu sehen*
bei der Arbeit, da es nur funktioniert, wenn Sie vorbei sind eine Liste an eine Funktion (statt der übergabe der Liste als ersten parameter,*
Ursachen der jedes element in der Liste übergeben werden, als separate parameter, einer nach dem anderen, als hätten Sie eingegeben haben, die durch Kommas getrennt in der Liste der parameter)...
)s in JavaScript! Ich habe es.Es spaltet die Sequenz in separaten Argumente für den Funktionsaufruf.
Nur eine alternative Möglichkeit zu erklären, das Konzept/die Verwendung.
def func(a, b, *args):
Finden Sie unter die Antwort für mehr info.