基本的に、2 つの反復子の「デカルト積」に対するリスト内包表記を構築したいと考えています。次のHaskell コードについて考えてみます。
[(i,j) | i <- [1,2], j <- [1..4]]
利回り
[(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4)]
簡潔な方法で Python で同様の動作を得ることができますか?
基本的に、2 つの反復子の「デカルト積」に対するリスト内包表記を構築したいと考えています。次のHaskell コードについて考えてみます。
[(i,j) | i <- [1,2], j <- [1..4]]
利回り
[(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4)]
簡潔な方法で Python で同様の動作を得ることができますか?
これについて質問していますか?
[ (i,j) for i in range(1,3) for j in range(1,5) ]
デカルト積はitertools モジュール(2.6) にあります。
>>> import itertools
>>> list(itertools.product(range(1, 3), range(1, 5)))
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
ネストされた内包表記についての興味深い事実: ネストされた "for" ループを模倣しているため、内側のループは外側のループの値を使用できます。これはデカルト積の場合には役に立ちませんが、知っておくとよいでしょう。例えば:
[ (i,j) for i in range(10) for j in range(i) ]
のすべてのペア(i,j)
を生成し0>=i>j>10
ます。
これはあなたが説明することをしているようです:
[[a,b] for a for range(1,3) for b for range(1,5)]
更新: ドラット! 投稿する前に、ページをリロードして S.Lott の回答を確認する必要があります。うーん...少しの付加価値のために何をすべきか? おそらく、Python での対話モードの有用性についての短い証言です。
私はごく最近 Perl のバックグラウンドを持っていたので、このような問題では、コマンド ラインで「python」と入力して対話モードにドロップし、a) 試行を開始し、b) ヒットして機能を改善することが非常に役立つと思います。 -矢印を押して、必要なものが得られるまで以前の試行を調整します。何かのキーワードでぼんやりしている時はいつでも、助けが手元にあります。help("some_keyword") と入力し、簡単な要約を読み、「Q」を押すだけで、Python インタープリターとの直接の会話に戻ることができます。
初心者で使っていない方におすすめです。