リストを組み合わせるために、次のイディオムを使用するのが好きな場合があります。
>>> list(itertools.chain(*[[(e, n) for e in l] for n, l in (('a', [1,2]),('b',[3,4]))]))
[(1, 'a'), (2, 'a'), (3, 'b'), (4, 'b')]
(この特定の結果を得る簡単な方法があることは知っていますが、リストのリストのリスト内の要素を反復処理する場合などに便利です。問題は、ジェネレーター式を使用するときに、これがエラーが発生しやすくなります。
>>> list(itertools.chain(*(((e, n) for e in l) for n, l in (('a', [1,2]),('b',[3,4])))))
[(1, 'b'), (2, 'b'), (3, 'b'), (4, 'b')]
ここで何が起こっているかというと、内側のジェネレーター式が引数として に渡されるitertools.chain
ため、それらが評価される時点で、外側のジェネレーター式は終了n
し、最終的な値である に固定されます'b'
。「そうしないでください」以外に、この種のエラーを回避する方法を誰かが考えたことがあるかどうか疑問に思っています。