Python(2次元配列の初期化)

■2次元配列の初期化の復習。
今まで迷路サンプルの試しで通った道の記録を取ってきたけど、その情報は下のように [縦の位置、横の位置]として取得している。

1 : [[1, 2], [1, 3], [1, 2], [1, 1], [1, 2], ... , [11, 11]]

これ自体は文字列として保存されているため、情報を整理するために変換する必要がある。似たような構成の文字列で下のようなコードを作った。

str1 = "[[1, 1], [1, 2], [1, 3], [2, 3], [1, 3], [2, 3], [3, 3]]"
str1 = str1.replace(' ', '')
str1 = str1.replace('[[', '')
str1 = str1.replace(']]', '')
str2 = str1.split('],[')

result = [[] for i in range(3)]
for i in range(1, 4, 1):
    for j in range(1, 4, 1):
        result[i - 1].append(str2.count(str(i) + ',' + str(j)))

for i in range(1, 4, 1):
    print(result[i - 1])

結果が次のもので、通った回数を配列として表記することで、視覚的にどこに多くいったか分かるようにした。


このコードを作る際に、2次元配列の宣言で少しはまったのでそのメモ。
空のリストを複数つくる場合、下のような宣言でもエラーが出ることはなく一見問題なさそうだけど、この場合、作成した空のリストは同じものを参照する形になっているよう。

result2 = [[]] * 3
result2[0].append(4)
print(result2[0])
print(result2[1])

result2[0]を更新すると、result2[1]にも同じ値(4)となる。


先の例のように「result = [[] for i in range(3)]」として宣言すると、それぞれ別のリストになるよう。result[0], result[1], result[2] としてそれぞれ別の空のリストができる。いくつかのサイトでこの構文が紹介されていた。