1. ホーム
  2. python

[解決済み] 関数呼び出しのアスタリスク[重複]について

2022-08-23 06:38:13

質問

itertools.chainを使って、このようにリストのリストを"flatten"しています。

uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))

と言うのとどう違うのでしょう。

uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))

どのように解決するのですか?

* は "splat"演算子です。これは入力としてリストを受け取り、それを関数呼び出しの実際の位置引数に展開します。

ですから、もし uniqueCrossTabs[ [ 1, 2 ], [ 3, 4 ] ] であった。 itertools.chain(*uniqueCrossTabs) は、次のように言うのと同じです。 itertools.chain([ 1, 2 ], [ 3, 4 ])

これは明らかに、単に uniqueCrossTabs . あなたの場合、平坦化したいリストのリストがあります。 itertools.chain() が行うのは、渡したすべての位置引数の連結に対するイテレータを返すことです。

言い換えれば、各リストを uniqueCrossTabs の各リストを引数として chain() への引数として指定すると、それらは連鎖していきますが、リストが別々の変数にあるわけではないので * 演算子を使ってリストのリストを複数のリスト引数に展開します。

Jochen Ritzel氏がコメントで指摘しているように chain.from_iterable() の方がこの操作に適しています。これは、そもそも単一の反復可能な反復記号を想定しているからです。そうすると、あなたのコードはシンプルになります。

uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))