12

多次元リストを初期化したい。基本的に、10x10 のグリッドが必要です。それぞれに 10 個のアイテムが含まれる 10 個のリストのリストです。

各リスト値は、整数 0 に初期化する必要があります。

ワンライナーでこれを行う明白な方法: 1myList = [[0]*10]*10つのリストへの 10 の参照のリストが生成されるため、機能しません。

私が見たドキュメントでは[:]、リストをコピーするために使用することについて話していますが、乗数を使用する場合はまだ機能しません:myList = [0]*10; myList = myList[:]*10と同じ効果がありmyList = [[0]*10]*10ます。

s のループを作成するmyList.append()以外に、この方法でリストを初期化する効率的な方法はありますか?

4

9 に答える 9

26

リスト内包表記を使用すると、非常に効率的に実行できます。

a = [[0] * number_cols for i in range(number_rows)]
于 2013-07-14T04:44:59.790 に答える
12

これは...ネストされたリストの理解のための仕事です!

[[0 for i in range(10)] for j in range(10)]
于 2013-07-14T04:42:33.297 に答える
3

質問は一般的なn次元のケースを求めていたので、答えを追加すると思っただけで、まだ答えられていないと思います。次の例を使用すると、任意の数の次元に対してこれを再帰的に実行できます。

n_dims = [3, 4, 5]

empty_list = 0
for n in n_dims:
    empty_list = [empty_list] * n

>>>empty_list
>>>[[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]
于 2014-09-26T19:57:00.857 に答える
0

さらに別の方法ですが、OPの拒否された方法を使用しています。

import numpy as np
myList = [[0]*10]*10
myList = np.array(myList)
l=myList.tolist()
myList=l

以下の出力とテスト:

>>> l
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> l[0][0]=100
>>> l
[[100, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

出力は、予想される のクローンとは異なりl[0]ます。

これは時間効率的ではありませんが。1000X1000 のリストの場合は 7 秒近くかかりますが、リスト内包表記には 0.0052158 秒しかかかりません。

于 2020-11-12T18:39:31.980 に答える
0

以下は、再帰的なリスト内包表記を使用して、任意の数の次元に対して機能する関数です。機能するためにインポートは必要ありません。

def init_list(dims, val):
    if len(dims) == 0:
        raise ValueError("Requires at least 1 dimension.")

    if len(dims) == 1:
        return [val for _ in range(dims[0])]

    return [init_list(dims[1:], val=val) for _ in range(dims[0])]

例:

>>> init_list([3, 2, 1], val=0)
[[[0], [0]], [[0], [0]], [[0], [0]]]
于 2021-01-23T14:32:13.277 に答える
0

いくつかのリストではなく、実際には配列が必要になる場合があります。この「事前にサイズ設定されたネストされたリスト」パターンを見るたびに、何かが正しくありません。

于 2013-07-14T05:27:53.907 に答える