7

2Dリストを作成していますが、リスト内包表記で初期化したいと思います。私はそれがこのようなことをしたいと思います:

[[x for i in range(3) if j <= 1: x=1 else x=2] for j in range(3)]

したがって、次のようなものが返されるはずです。

[[1,1,1],
 [1,1,1],
 [2,2,2]]

どうすればこれを行うことができますか?

ご協力いただきありがとうございます。

4

3 に答える 3

14

次のようなものを探しているように見えます。

[[1 if j <= 1 else 2 for i in range(3)] for j in range(3)]

Pythonの条件式は、CやJavaなどから来ている場合に慣れているものとは少し異なります。

x if C else yは最初にCを評価します(xではありません)。Cが真の場合、x評価され、その値が返されます。それ以外の場合は、yが評価され、その値が返されます。

同じことを行うための少し短い方法は次のとおりです。

[[1 if j <= 1 else 2]*3 for j in range(3)]
于 2009-10-05T23:49:46.580 に答える
14

グレッグの応答は正しいですが、目的の結果を生成するためのはるかに単純で高速な式は次のようになります。

[[j] * 3 for j in (1, 1, 2)]

つまり、のみforに適用する必要はないことを覚えておいてくださいrange;-)、リスト乗算が存在する、など;-)。

于 2009-10-05T23:55:08.533 に答える
1

それを試してみてください

>>> [[(1 if j<1 else 2) for i in range(3)] for j in range(3)]
[[1, 1, 1], [2, 2, 2], [2, 2, 2]]

2回目はj=1なので、j<1は失敗します

于 2009-10-05T23:55:33.837 に答える