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

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

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

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

Q&A

解決済

1回答

452閲覧

can't multiply sequence by non-int of type 'float'

wakahide

総合スコア23

Python 3.x

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

0グッド

0クリップ

投稿2020/06/09 03:05

編集2020/06/09 08:01

DP問題で、考察のためにタップルにして答えを返したいのですが、メイン関数の下の方の

outcomes[j][1]

をタップルとして挿入すると解にエラーが生じます。色々と試行錯誤しているのですが、何がエラーの原因か特定できませんので、もし分かる方はご教授いただけないでしょうか。

outcomes[j][1]を入れなければ、解は返ってくるので、コード自体に間違いはなく、タップル化するとうまくループできずに、エラーになっているようです。

メインの関数がこちらで、stateには[1,1,1,1,0,0,0,0,0]を入れます。

_V = {} def V(state): if state.count(0)==0: return 0 if tuple(state) not in _V: nextSites = NextSite(state) outcomes = newOutcomes1(state) _V[tuple(state)] = max((ExpectedSpecies(state, nextSites[j][1])+ sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1])) for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes))) return _V[tuple(state)]

エラーの原因となっている行は、V(state)の下から2行目、
”for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes)))”です。

エラーメッセージは以下が返ってます。
for i in range(len(outcomes[j][0]))), outcomes[j][1]) for j in range(len(outcomes)))
TypeError: can't multiply sequence by non-int of type 'float'

試した修正としては、
・ブランケットの位置を確認。
・オリジナルの、”for i in range(len(outcomes[j][0]))) for j in range(len(outcomes)))”は正しく動いている。
・for i in range(len(outcomes[j][0]))), j ) for j in range(len(outcomes)))では同様のエラー。
・for i in range(len(outcomes[j][0]))), "1" ) for j in range(len(outcomes)))でも同様のエラーであるため、タップルにしてるのが原因かと推定。
・max([ExpectedSpecies(state, nextSites[j][1])+
sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1]))
for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes)))
for i in range(len(outcomes[j][0]))), i] ) for j in range(len(outcomes)))をリスト型にしてみるがエラーを解決できず。

といった状況です。

上記コードを補佐する関数が下記になります。

from itertools import combinations def NextSite(state): outcomes = GenerateOutcomes(state, [0.2 for j in Sites]) outcomes = [[outcomes[i][0], list(outcomes[i][1]), j] for i in range(len(outcomes)) for j in Sites if outcomes[i][1][j] == 0] for i in range(len(outcomes)): outcomes[i][1][outcomes[i][2]] = 1 return [[outcomes[i][1], outcomes[i][2]]for i in range(len(outcomes))] def newOutcomes1(state): nextSites = NextSite(state) outcomes = [] for i in range(len(nextSites)): outcomes.append([GenerateOutcomes(nextSites[i][0], [0.2 for j in Sites]),nextSites[i][1]]) return outcomes def SavedSpeciesList(state): SavedSpeciesList = [] for i in Sites: if state[i] == 1: SavedSpeciesList = SavedSpeciesList+[j for j in Species[i] if j not in SavedSpeciesList] return (SavedSpeciesList) def ExpectedSpecies(state, i): return (len(list(set(Species[i]) - set(SavedSpeciesList(state))))) Species={ 0:[10,15], 1:[4,8,17], 2:[18], 3:[0,10,17], 4:[1,9,11], 5:[0,5,16], 6:[14], 7:[0,9,12,16], 8:[1,7,19] } Sites = range(9) def GenerateOutcomes(State, LossProb): ans = [] tempSites = [j for j in Sites if State[j]==0] n = len(tempSites) for i in range(n+1): for tlist in combinations(tempSites, i): p = 1.0 slist = list(State) for j in range(n): if tempSites[j] in tlist: p *= LossProb[tempSites[j]] slist[tempSites[j]] = -1 else: p *= 1-LossProb[tempSites[j]] ans.append((p, tuple(slist))) return ans

乱雑なコードで恐縮ですが、どうぞよろしくお願い致します。

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

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

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

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

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

t_obara

2020/06/09 06:17

どの行がエラーなのか明記してください。 ちなみに、エラー文をググった結果、試した内容も記載すると回答が得られやすくなると思います。
wakahide

2020/06/09 06:57

コメントありがとうございます。 エラーの行は、V(state)の下から2行目、 ”for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes)))”です。 エラーメッセージは以下が返ってます。 for i in range(len(outcomes[j][0]))), outcomes[j][1]) for j in range(len(outcomes))) TypeError: can't multiply sequence by non-int of type 'float' 試した修正としては、 ・ブランケットの位置を確認。 ・オリジナルの、”for i in range(len(outcomes[j][0]))) for j in range(len(outcomes)))”は正しく動いている。 ・for i in range(len(outcomes[j][0]))), j ) for j in range(len(outcomes)))では同様のエラー。 ・for i in range(len(outcomes[j][0]))), "1" ) for j in range(len(outcomes)))でも同様のエラーであるため、タップルにしてるのが原因かと推定。 ・max([ExpectedSpecies(state, nextSites[j][1])+ sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1])) for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes))) for i in range(len(outcomes[j][0]))), i] ) for j in range(len(outcomes)))をリスト型にしてみるがエラーを解決できず。 といった状況です。
t_obara

2020/06/09 07:14

質問に追記する形の方が回答が得られやすくなります。 ちなみに、提示されたエラーがどのような原因で発生するのかはわかっていますか? 問題をより理解しやすくするために、リスト内包表記ではなく、普通のfor文で書いてみると良いのではないでしょうか。あくまでも問題解決のためですが。
wakahide

2020/06/09 07:41

原因としては、 max(ExpectedSpecies(state, nextSites[j][1])+ sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1])) for i in range(len(outcomes[j][0]))) for j in range(len(outcomes))) を max((ExpectedSpecies(state, nextSites[j][1])+ sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1])) for i in range(len(outcomes[j][0]))), outcomes[j][1]) for j in range(len(outcomes))) に変更したことです。 最大化した時のjの値を同時に知りたかったのでoutcomes[j][1]を加えたのですが、これがなければ答えは得られます。
guest

回答1

0

ベストアンサー

エラーの原因は、浮動小数点の数値とタプルを乗算しているからです。
以下、解説。

max関数にタプルを投入すると、辞書順のように先頭の要素から比較して最大となるタプルの組が返ってきます。
サンプル:

python

1max((1,1),(1,2),(2,-1),(2,0)) 2 3>>> (2, 0)

※初稿では説明が誤っていたのでサンプルとともに訂正しました。

質問文のコードで、,outcomes[j][1]を入れた場合、max関数に( 元の値, outcomes[j][1] )タプルがjのイテレーション分投入され、結果_V[tuple(state)]にはタプルが入ります。
(return 前にprint(_V[tuple(state)])を入れて中を見てみると、(2.0, 8)とかが入っているのが確認できます)

その結果、outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1]))の計算が浮動小数点×タプルの計算になり、can't multiply sequence by non-int of type 'float' のエラーになります。
訳すと、シーケンス(タプルのこと)とintでない数値(この場合はfloat)の乗算はできないよ、です。
(ちなみに整数とタプルの乗算はできます。タプルの中身が倍々に増えていく)

投稿2020/06/09 13:34

編集2020/06/09 14:07
hope_mucci

総合スコア4447

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

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

wakahide

2020/06/10 01:37

ご丁寧に回答頂きありがとうございました。タプルの取り扱いに気づけませんでした。 outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1]))をoutcomes[j][0][i][0]*V(list(outcomes[j][0][i][1]))[0]とすることでcan't multiply sequence by non-int of type 'float' のエラーは取り除かれました。 新たに、 for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes))) TypeError: 'int' object is not subscriptable のエラーが出てしまいましたが、もう少し自分でも調べてみたいと思います。
hope_mucci

2020/06/10 02:10

このコードはネストが深すぎるので、カッコのネストごとに改行してインデントを付与すると原因に気づきやすいかと思います。新しく出たエラーもコードを整理すればすぐ気づけると思います。頑張ってください。
wakahide

2020/06/10 06:42

立て続けに申し訳ないです。なかな一人で原因に気づくことが難しく、、、 差し支えなければ、何が原因なのかのか教えて頂けないでしょうか。甘え続けですみません。
hope_mucci

2020/06/10 06:49

大ヒント。 ・subscript -> 添え字 ・return に注目。何個ある?返す値はどうなっている?
wakahide

2020/06/11 00:41

ありがとうございます。おかげさまで解決できました。 base stateのところをタップルで返す必要があったのですね。
hope_mucci

2020/06/11 01:45

スマートに修正するなら、最後の_Vをreturn する際にタプルではなくfloat値のみを返すようにする。そうすれば他の箇所の修正は必要なかったです。 return _V[tuple(state)][0] 作ったタプルは_Vの中に入っているので後から見ることができますしね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問