10

基本的に、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 で同様の動作を得ることができますか?

4

4 に答える 4

21

これについて質問していますか?

[ (i,j) for i in range(1,3) for j in range(1,5) ]
于 2008-12-01T02:58:14.950 に答える
8

デカルト積は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)]
于 2008-12-01T03:40:28.347 に答える
5

ネストされた内包表記についての興味深い事実: ネストされた "for" ループを模倣しているため、内側のループは外側のループの値を使用できます。これはデカルト積の場合には役に立ちませんが、知っておくとよいでしょう。例えば:

[ (i,j) for i in range(10) for j in range(i) ] 

のすべてのペア(i,j)を生成し0>=i>j>10ます。

于 2008-12-01T09:12:21.310 に答える
2

これはあなたが説明することをしているようです:

[[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 インタープリターとの直接の会話に戻ることができます。

初心者で使っていない方におすすめです。

于 2008-12-01T03:03:33.660 に答える