質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

3回答

691閲覧

なぜout of rangeになるのか分からない

Plasma

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/03/10 07:31

編集2023/03/10 09:20

実現したいこと

カードの数字の積の最大値を求めたい

前提

Nはカードの枚数(2 <= N <= 10)
CにN個の数字がスペースで区切られて入力されます。(-5 <= c <= 5)

そのカードの中から2枚取り出し(card_a, card_b)、
片方の数から1を引いて、もう片方の数に1を加えます。
(card_a-1, card_b+1)

そしてcard_a,とcard_bと残りのカードの数の積を求めます。
この積の最大値を求めたいです。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "Main.py", line 12, in <module> l.append(card_a* card_b* copylist[0]* copylist[1]* copylist[2]) IndexError: list index out of range

l.append(数式)の部分がエラーになっているようです

C = [-3,-1,-5,1,2]の場合に正しい結果(0)を導き出せない問題があります。

該当のソースコード

Python

1# coding: utf-8 2import math 3N = int(input()) 4C = [c for c in map(int,input().split(" ")) if 2 <= N <= 10 and -5 <= c <= 5] 5l = [] 6for card_a in C: 7 copylist = C.copy() 8 copylist.remove(card_a) 9 card_a -= 1 10 for card_b in copylist: 11 copylist.remove(card_b) 12 card_b += 1 13 l.append(card_a* card_b* math.plod(copylist)) #変更 14print(max(l))

試したこと

元のリストCをコピーして、card_a, card_bをremoveメソッドで削除しました。
コピーしたリストには3つの数字が残っているはずなのですが、
なぜかcopyist[2]と書くとout of rangeになってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Plasma

2023/03/10 07:44

12行目にprint(copylist)を追加すると [5, 1, -4] [5, -4] このように二つリストが表示されます。 朝から色々試行錯誤していますがこの原因が全く分からないので困っています。
TakaiY

2023/03/10 07:55

> l.append(card_a* card_b* copylist[0]* copylist[1]* copylist[2]) ここで、なぜ、「残りのカード」を3枚(0~2)固定としているのでしょうか? N は 5 と決まっているのですか?
Plasma

2023/03/10 08:28

確かにそうですね!入力値を固定したまま試行錯誤していました! import math l.append(card_a* card_b* math.prod(copyist)) ↑このように変更したらC = [1,2,3,4,5]の場合に正しい答え(⭕️192)を出せたのですが、 C = [-3,-1,-5,1,2] のような場合に間違えてしまいます。(❌80→⭕️0) 他にもおかしいところがあるみたいです...
melian

2023/03/10 08:53

こちらでは、C = [-3,-1,-5,1,2] の場合を変更後のコードで実行すると正しく 80 という結果が返ります。
Plasma

2023/03/10 09:10

失礼しました。正答が「0」になるようなのですが、 80が出てしまうという事ですね。 マイナスが3つあるので単純に積はマイナスになるのですが、 -1に対して1を加えて0にすることで 最大値が「0」になるという事だと思うのですが、 このプログラムだとその結果が出せないようです...
melian

2023/03/10 09:14

お手数ですみません、読み間違いをしていました。
TakaiY

2023/03/10 09:44 編集

デバッグしてどのような時に80となるのか調べてみたらいいと思うのですが。 また、can110さんの回答は確認されましたか?
guest

回答3

0

エラーの原因はおいておいて、そもそも提示された問題を解く場合にremoveを使うのは止めた方がよいです。
removeは同じ値があれば、つねにその先頭のものが削除されます。
つまり[1,2,1].remove(1)の結果はつねに[2,1]になります
そのかわりに配列の位置ベースで考えたほうが分かりやすいです。

以下のコードがどのような動きをするかを確認し
問題を解くためにどのように修正して動かせばよいかを考えてみてください。

Python

1N = 3 2C = [1,2,3] 3for na in range(N): 4 for nb in range(N): 5 if True: # bはa以外を選択したい… 6 print(f'a={C[na]}, b={C[nb]} 他=', end='') 7 for n in range(N): 8 if True: # 他はa,b以外を選択したい… 9 print(C[n], end=',') 10 print() 11""" 12a=1, b=1 他=1,2,3, 13a=1, b=2 他=1,2,3, 14a=1, b=3 他=1,2,3, 15a=2, b=1 他=1,2,3, 16a=2, b=2 他=1,2,3, 17a=2, b=3 他=1,2,3, 18a=3, b=1 他=1,2,3, 19a=3, b=2 他=1,2,3, 20a=3, b=3 他=1,2,3, 21"""

投稿2023/03/10 08:21

編集2023/03/10 08:38
can110

総合スコア38337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例えばN=3であれば最初のappendまでに
copylist.remove(card_a)
copylist.remove(card_b)
で2要素が消されますのでcopyistの要素数は1になります。
明らかにcopyist[2]は範囲外です。

Nが大きくてもcopylist.remove(card_b)が繰り返されてcopyistの要素数はどんどん減るので
いつかはcopyist[2]は範囲外になります。

投稿2023/03/10 08:03

ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なぜかcopyist[2]と書くとout of rangeになってしまいます。

エラーが出たからとそこで思考停止するんではなく、なぜそうなったのかを調査しましょう。
まずは、copyistになにが入ってるのか見てみよう

投稿2023/03/10 07:35

y_waiwai

総合スコア87985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問