0
0

More than 3 years have passed since last update.

【Pythonメモ】2次元配列(リストのリスト)の作成で注意すること

Posted at

0.問題

1行目に行(n1)と列(n2)が、2行目以降にn2列の.または#がn1行入力されます。
2行目以降のn1行の文字列を2次元配列に格納してください。

1.入力データ

例として以下の入力データを与える

3 5
#####
.#.#.
#.#.#

2.コード例


#作成する配列の行と列をスペース区切りで入力
in1 = input()
arr1=in1.split()

#横に上記で指定したarr1[1]列分の文字列をarr1[0]行文読み込む
in2=[]
for i in range(int(arr1[0])):
    tmp1=input()
    in2.append(tmp1)

#以下の二次元配列(arr1[0]行arr1[1]列)を作成
arr2=[[''] * int(arr1[1]) for i in range(int(arr1[0]))]
arr3=[['']*int(arr1[1])]*int(arr1[0])

#上記で定義した2次元配列を表示
print(arr2)
print(arr3)

for i in range(int(arr1[0])):
    tmp2=in2[i]
    for j in range(int(arr1[1])):
        arr2[i][j]=tmp2[j:j+1]
        arr3[i][j]=tmp2[j:j+1]


print(arr2)
print(arr3)

3.出力結果

[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']]
[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']]
[['#', '#', '#', '#', '#'], ['.', '#', '.', '#', '.'], ['#', '.', '#', '.', '#']]
[['#', '.', '#', '.', '#'], ['#', '.', '#', '.', '#'], ['#', '.', '#', '.', '#']]

1行目と2行目は、初期化した2次元配列のデータが表示される。
注目するのは3行目と4行目の実行結果の違いだ。

arr3の全ての配列の値が、入力最終行のデータに置き換わっているのだ。

4.検証

Pythonのリスト(配列)を任意の値・要素数で初期化を参考に
上記コードに下記コードを追加する。

print(arr2[0]==arr2[int(arr1[0])-1])
print(arr3[0]==arr3[int(arr1[0])-1])
False
True

arr3の要素のリストが全て同じオブジェクトとして扱われるため、
一つのリストが更新されると他のリストも同じ内容で更新されるという事らしい。

結論

2次元配列を初期値付きで宣言する場合は

リスト名=[[初期値] * 列数 for 任意の変数 in range(行数)]

を使う。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0