非常に長いコードを使用せずに、Pythonの多次元の空のリストを作成したいと思います。だから私はこれを試しました:
a = [[[]] * 2] * 2
print(a)を実行すると、多次元の空のリストが表示されます。
[[[], []], [[], []]]
しかし、空のリストの1つに何かを追加すると、次のようになります。
a[0][0].append(np.array((1.5,2.5)))
すべての空のリストはこのnp.arrayを取得しました:
[[[array([1.5, 2.5])], [array([1.5, 2.5])]], [[array([1.5, 2.5])], [array([1.5, 2.5])]]]
しかし、以下のように多次元の空のリストを作成すると、次のようになります。
b = []
for i in range(2):
c = []
for j in range(2):
c.append(([]))
b.append(c)
できます。印刷(b)しても、次のようになります。
[[[], []], [[], []]]
しかし、私がするとき
b[0][0].append(np.array((1.6,2.6)))
次にprint(b)、私は得ました:
[[[array([1.6, 2.6])], []], [[], []]]
それが私が欲しいものです。
なぜ起こるのですか?
Python3.6.8を使用しています
これは私のコードです:
これは間違っています:
a = [[[]] * 2] * 2
print(a)
a[0][0].append(np.array((1.5,2.5)))
print(a)
これは私が欲しいものです:
b = []
for i in range(2):
c = []
for j in range(2):
c.append(([]))
b.append(c)
print(b)
b[0][0].append(np.array((1.6,2.6)))
print(b)
なぜ機能しa = [[[]] * 2] * 2
ないのですか、そしてどうすればこれをすぐに作成できますか?ありがとう!
あることがうまくいくと別のことがうまくいかないということではなく、異なる結果を期待しているということです。それぞれ[]
がリストを作成しますが、そのリストは変更可能です。リストの乗算では、新しい要素は作成されませんが、それらへの新しい参照が作成さ[[]]*2
れるため、同じ内部リストへの2つの参照が含まれています。多次元リストの概念はありません。他のリストを保持するリストにすぎません。でfor
ループ、あなたは走った[]
別個のリストを作成し、複数回。
基本的には、の[[]]*2
よう[[], []]
に見えますが、実際にはb
後のようですがa = []; b = [a, a]
、[[], []]
はのようa1 = []; a2 = []; b = [a1, a2]
です。
リスト作成構造をよりコンパクトに記述する1つの方法は、リスト内包表記を使用することです。
listoflists = [[[] for i in range(2)] for j in range(2)]
別のオプションは、NumPyのndarrayなど、複数の次元をサポートする構造を使用することです。
>>> import numpy
>>> a = numpy.ndarray((2,2), numpy.object)
>>> a
array([[None, None],
[None, None]], dtype=object)
ただし、これは行列用に構築されているため、独立した長さのリストはありません。
このため、標準ライブラリの一部では、プロトタイプオブジェクトの代わりにファクトリ関数の使用がサポートされていcollections.defaultdict(list)
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加