私は、itertools.chain を使用して、次のようにリストのリストを「フラット化」しています。
uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))
これは次のように言うこととどう違うのでしょうか:
uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))
ベストアンサー1
*
は「スプラット」演算子です。リストのような反復可能オブジェクトを入力として受け取り、関数呼び出しで実際の位置引数に展開します。
つまり、uniqueCrossTabs
であれば[[1, 2], [3, 4]]
、 はitertools.chain(*uniqueCrossTabs)
次のように言うのと同じである。itertools.chain([1, 2], [3, 4])
これは明らかに、 だけを渡すのとは異なりますuniqueCrossTabs
。あなたの場合、平坦化したいリストのリストがあります。 は、itertools.chain()
渡したすべての位置引数の連結に対して反復子を返します。各位置引数は、それ自体で反復可能です。
つまり、各リストをuniqueCrossTabs
の引数として渡してchain()
、それらを連結したいのですが、リストを個別の変数に持っていないため、*
演算子を使用して、リストのリストを複数のリスト引数に拡張します。
chain.from_iterable()
は、最初から反復可能オブジェクトのうち単一の反復可能オブジェクトを前提としているため、この操作に適しています。コードは次のように単純になります。
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))