Pythonで宝くじを当てよう #1

Pythonの2次元配列は手ごわい

前回のtest.pyではリスト型に直接データを書き入れた。
しかし、これでは1400×6個のデータを書き込む必要があるし、追加のたびにソースを開いて修正する必要がある。
当然、データファイルを用意してそれに追加データを書き込み、プログラムはそのファイルから読み込むことになる。

で、その前にtest.pyの初期入力のリストデータを後から追加する形に変更した。

test_data = [[0]*3]*3
v = 1
for i in range(3):
     for j in range(3):
         test_data[i][j] = v
         v += 1
 
for v in test_data:
      print(v)

リスト型2次元配列(3×3)を用意して一つずつインクリしてデータに書き込んでいく。
この結果を表示させる。
当然結果は
[1,2,3] [4,5,6] [7,8,9] となるはず・・・

結果を見てみよう

[7, 8, 9] [7, 8, 9] [7, 8, 9]

ヌヌヌヌ
こんな筈はない。正直、そう思って、ほぼ一日イングリモングリ考えたりソースを書き換えたり。

普通の(C,C#,Delphiなど)を先に勉強した人はまずここでこの落とし穴に落ちることになると思う。

私も見事に落とし穴に落ちて、落とし穴の底からどれだけ空を見上げたか。

色々調べた結果、今でもよく説明できないが、
test_data = [[0]*3]*3は[0]*3のコピーを3つ作るということになるらしい。
したがって、最後に入力した[7,8,9]を3つコピーを作成している。

こんな宣言要らんわ! Pythonではこんな宣言使い道があるのかな、普通こんなもん要らんと思うけど。
というても仕方ない、それがPythonなんやから。

色々調べてリスト型の宣言を
test_data = [[0]*3 for in range(3)]とする。

test_data = [[0]*3 for i in range(3)]
v = 1
for i in range(3):
       for j in range(3):
             test_data[i][j] = v
            v += 1.
 
for v in test_data:
       print(v)

何とか無事にクリア。
しかし、これらのことはネットを渡り歩いて分かったこと。前回紹介した「Pythonスタートブック」には欠片も出ていない。
やはり、数値計算には向いていないので、配列しかも2次元配列などあまり念頭にないのかもしれない。

しかし、これでロト6のデータを入れる箱の用意はできた。
次の回はファイルを読んでデータの箱に入れる。
その前に、ウナギの寝床のプログラムにならないように、関数を作ろう。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です