3

次の方法で 3D リストを作成しようとしています。

l1 = []
for _ in range(5):
    l2 = []
    for _ in range(10):
        l2.append([0] * 20)
    l1.append(l2)

それは本当にうんざりしているように見えます。これを達成するために、高階関数またはアノン関数またはリスト内包表記を使用する方法が必要だと思います。これを達成する方法を教えてくれるPython忍者はいますか?

ありがとう!

4

3 に答える 3

3

numpy「ベクトル化された」計算を計画している場合は、使用を検討できます。

l1 = np.zeros((5, 10, 20))

ドキュメント。

于 2013-02-20T22:46:25.817 に答える
2

これを試して:

[[[0]*20 for _ in xrange(10)] for _ in xrange(5)]

@zch によって最初に与えられた答えには非常に深刻な問題があります。結果のマトリックスに同じリストが何度もコピーされるため、ある位置の変更が他の無関係な位置に同時に反映されます!

私の解決策は確かに の定義と同等ですがl1、リスト内包表記を使用したおかげでもう少し簡潔に書かれています。反復変数を使用していないことに注意してください。そのため_、プレースホルダーとして使用しても問題ありません。また、Python 2.x を使用していると仮定すると、xrangeによって作成されたリストは必要ないため、使用する方がよいでしょうrange。(Python 3.x を使用している場合は、使用しても問題ありませんrange)

于 2013-02-20T23:00:08.503 に答える
1
>>> l1 == [[[0]*20]*10]*5
True

しかし、この方法ではエイリアシングが発生します。たとえば、変更a[0][1][2]すると変更も発生しますa[4][5][2]。これを回避するには、コピーが必要です。

[[[0]*20 for i in range(10)] for j in range(5)]
于 2013-02-20T22:47:06.110 に答える