Pythonのループがおかしいので助けてください

1 : 2021/08/07(土) 16:54:57.957 ID:UQMiSuir0
Pythonで以下のコードを実行しました
期待する配列がprintされないので助けてください。

weights = [3,2,5,8,1,8,1,3]
N = len(weights)
way = [[1,1],[10,8],[5,6],[8,7],[8,5]]
M = len(way)
dp = [[[10,10]] + [[0,0]]*(M) for i in range(N + 1)]

for i in range(N):
for j in range(M):
dp[i + 1][j + 1][0] = way[j][0]
dp[i + 1][j + 1][1] = way[j][1]

print(dp)

2 : 2021/08/07(土) 16:55:16.860 ID:UQMiSuir0
#期待する配列
[
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
[[10, 10], [1, 1], [10, 8], [5, 6], [8, 7], [8, 5]],
]

#printされる配列
[
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]],
[[10, 10], [8, 5], [8, 5], [8, 5], [8, 5], [8, 5]]
]

3 : 2021/08/07(土) 17:01:44.880 ID:of1L6z2U0
マジレスしていいの?
5 : 2021/08/07(土) 17:02:55.366 ID:UQMiSuir0
>>3
お願いします!
6 : 2021/08/07(土) 17:04:05.906 ID:of1L6z2U0
>>5
ちょい待ち
7 : 2021/08/07(土) 17:04:48.244 ID:UQMiSuir0
>>6
ありがとうございます!
4 : 2021/08/07(土) 17:02:29.646 ID:UQMiSuir0
検証のため、i == 0 and j == 0の時のdpをprintしてみました

weights = [3,2,5,8,1,8,1,3]
N = len(weights)
way = [[1,1],[10,8],[5,6],[8,7],[8,5]]
M = len(way)
dp = [[[10,10]] + [[0,0]]*(M) for i in range(N + 1)]

for i in range(N):
for j in range(M):
dp[i + 1][j + 1][0] = way[j][0]
dp[i + 1][j + 1][1] = way[j][1]

#デバッグ用
if i == 0 and j == 0:
print(dp)

するとこのような配列がprintされます。
この時点でdp[1][1]からdp[1][5]まで[1, 1]で埋め尽くされる理由がわからない・・
dp[1][1]のみがに[1, 1]が入っていて欲しいんだけど
[
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[10, 10], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
]

8 : 2021/08/07(土) 17:05:47.868 ID:rq9zV8RZ0
なるほどな
9 : 2021/08/07(土) 17:07:02.533 ID:jQPhzRFu0
データフレームは使っちゃダメなの
10 : 2021/08/07(土) 17:09:52.499 ID:UQMiSuir0
>>9
すみません、データフレームがよく分からず使いこなせないのでとりあえずは使わない方針でコードを書きたいと思っています
11 : 2021/08/07(土) 17:11:53.983 ID:of1L6z2U0
確かにおかしいな
何だこれ
12 : 2021/08/07(土) 17:16:00.992 ID:of1L6z2U0
あーそういうことか、たぶん分かったわ
13 : 2021/08/07(土) 17:19:36.505 ID:of1L6z2U0
a = [[1]] + [[2]] * 3
a[0][1] = 10
print(a)

これ実行してみれば原因がわかると思うよ

14 : 2021/08/07(土) 17:21:05.207 ID:UQMiSuir0
>>13
確認します!
16 : 2021/08/07(土) 17:21:50.793 ID:xvt0Cd420
>>13
python覚えてないけどやっぱそこなのか
dpに代入してる式で何やってるのかよく分からんかった
15 : 2021/08/07(土) 17:21:16.060 ID:4JKfvrURr
俺は設定6で6500枚と6000枚が最高や

どんだけすごいじこやねんか

17 : 2021/08/07(土) 17:21:54.481 ID:dMxo5Vegr
すごろく
18 : 2021/08/07(土) 17:24:19.534 ID:UQMiSuir0
list assignment index out of range
になるのですが、それが関係しているという事ですか?
19 : 2021/08/07(土) 17:26:16.288 ID:of1L6z2U0
>>18
ごめんこうだった

a = [[1]] + [[2]] * 3
a[1][0] = 10
print(a)

22 : 2021/08/07(土) 17:30:07.688 ID:UQMiSuir0
>>19
ありがとうございます!
似たような現象が再現できた
ちょっと考えてみます
20 : 2021/08/07(土) 17:27:20.362 ID:9zJ/gWfc0
はぁなるほどね
こういうのうっかりハマりそうで怖いな
21 : 2021/08/07(土) 17:27:26.103 ID:/EjbHc+Jr
1年前事故って7000枚出したけど全然増えないし時間かかるし死ぬほど疲れた記憶しかない
23 : 2021/08/07(土) 17:31:11.658 ID:71vAAznz0
配列の初期化の仕方が気持ち悪い
24 : 2021/08/07(土) 17:32:43.276 ID:9zJ/gWfc0
これ競プロとかでしょ?
何か独特な書き方するよね
25 : 2021/08/07(土) 17:33:21.059 ID:xvENAQ5v0
dpに代入する行で何やってるのか分からんのだが誰か解説してくれ
26 : 2021/08/07(土) 17:35:18.788 ID:of1L6z2U0
>>25
(i+1,j+1)成分がway[j]になるようにしてる
27 : 2021/08/07(土) 17:35:28.300 ID:CAntoah3r
俺が最初に見たのは堂本剛のやつ
28 : 2021/08/07(土) 17:36:53.413 ID:UQMiSuir0
ありがとうございました
dp配列の定義の仕方が良くなかったのですね
変な書き方やめて素直に書くことにします
30 : 2021/08/07(土) 17:39:55.832 ID:FwtZZE8+r
ざっこw
32 : 2021/08/07(土) 17:50:24.384 ID:UQMiSuir0
このような書き方に変更したら意図した動きになりました
dp = [[[10,10]] + [[0,0] for j in range(M)] for i in range(N + 1)]

コメント

タイトルとURLをコピーしました