TypeError: sequence item 0: expected str instance, int found
あー、paizaのとある問題やってたらなんかまた初歩的なとこで引っかかった。
paizaは問題の回答書いちゃダメみたいなので、下記の私のミスはpaizaの問題がバレないように改変してあります。
リストの中身を結合させたかったので下記のように記述してみた所、エラーを吐くようで。
>>>test = [1, 2, 3, 4, 5] >>>print(' '.join(test)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 0: expected str instance, int found
なんでや、と他の所をチェックするも特にミスが見当たらず。
ドツボにはまりながら原因を探っていたら、やっぱりここだった。
.join()は文字列じゃないと結合できないっていうのを忘れていた・・・
ちゃんとエラーを調べればすぐ分かったのになー。くそー。
はい、これが正解。
>>>test = ["1", "2", "3", "4", "5"] >>>print(' '.join(test)) 1 2 3 4 5
これはこうやったら出来るかな?みたいな部分の記述があると、エラーが出た時にそこを疑ってしまうんだよなぁ。
あー、やっぱりあそこがダメだったかー、と、勝手に解釈してしまう。
ちょっと当てずっぽうみたいな感じで書いちゃってるのが良くないのかな。
まぁ結果合ってるんだけど、理解してるとは言い難いですな。
エラーチェックを怠らない。
これ今日の教訓。
久しぶりにサーバーを触ってみたら・・・
MusicBotを実装してから満足してサーバーを放置していました。
最近はもっぱらDjangoの勉強に時間を割いていますが、ちょこちょこ覚えたLinuxのコマンドを試してみようとTera Termからログインを試みました。
しかし、何故でしょう。ホストに繋がりません。
ポートも22からは変えてますが、ちゃんと変更したポートを入力してるし原因が謎です。
とりあえずグーグル先生に聞いてみたところ、firewallの設定っぽい事が判明しました。
前に設定したんだけどなぁ・・・と思いつつ、さくらVPSの管理画面から直接ログインをしてfirewallのファイルを覗いてみたらportが22のままでした・・・
恐らく前回設定をした後に sudo firewall-cmd --reload これを実行するのを忘れたようです。
この設定をしたらTera Termからログイン出来るようになりました。良かった。
しかしほんと時間足りないなぁ…
djangoもやりたいし、rubyもやりたいし、Linuxも勉強したいし、やりたい事一杯。
まぁあれもこれも手を出してどれも中途半端は避けたいので、その日やる事をちゃんと決めてマイペースにやっていかないとですね。
何事も、日々の地道な努力の積み重ねが大事です。 何より難しいのがこれですけどね。
がんばろ。
今日はDjangoのお勉強
やっぱり朝イチが一番勉強の効率がいいなぁ。
今日はDjangoのお勉強をしてるけど、理解が深まった気がする。
いくつか教材的なのを購入したけど、どれも反復してると段々分かってくるもんだ。
もっと覚えて自力でブログ位は立ち上げたい。
いや、ブログくらいならもう出来そうだな。
株価とかそうゆうの沢山表示する情報サイトみたいなの作ってみようかな。
あ、でも別にそれってDBいらないな。
まぁいいか。
プログラムたのすぃ。
トイレ判定プログラム
discordのbotで、トイレに行ったら時間を計測してその時間でうんちかおしっこかを判定するなんとも下世話なプログラムを作っています。
ほら、小学校の時とかにトイレの個室の方に入ると大騒ぎだったじゃないですか?
あれの簡易版みたいなものです(違
ちょっとまだ途中なのですが、いくつか問題点が出てきたので頭の整理を含めアウトプットしておきます。
途中の記載は省略してあります。
timeモジュールを使用しています。
判定用の空のtime_listというリストを作ってあります。
elif 'といれ' in message.content: if client.user != message.author: time_list.append(int(time.time())) m = 'いっといれ!' await client.send_message(message.channel, m) elif 'もどり' in message.content: if client.user != message.author: if len(time_list) == 1: time_list.append(int(time.time())) m1 = 'おかえり!' await client.send_message(message.channel, m1) time_watch = time_list[1] - time_list[0] m2 = '計測時間は{}秒です!'.format(time_watch) await asyncio.sleep(2) await client.send_message(message.channel, m2) time_list.clear() else: m3 = 'おか!' await client.send_message(message.channel, m3)
とりあえず時間計測できたので、時間によってうんちかおしっこを判定する部分は作っていません。 これはすぐ出来そうなので後々作る予定です。
まだまだ作りが甘いので判定する文字列にも不安があります。
このbot作成で困るのが、誰がどの発言をしたか保持出来ない、という点です。
上記の場合で言うと、Aさんが'といれ'と発言をして席を立ちます。
しかし、その前にBさんは離席をしていて、戻ってきたので'もどり'と発言をしました。
time_listの個数で計測する分岐を作っているので、Bさんの'もどり'発言でも処理が走ってしまうのです。
Aさんだけの発言を保持出来れば、純粋にAさんだけのトイレタイムを計測出来るんですけどね。
また、仮に個別に保持出来たとして、AさんもBさんもCさんもトイレに行った場合にさらに各々で情報を持てるのかも気になります。
何か方法があるのかな?
しかし作り手がしょーもないと、Botもしょーもなくなってくのね。
でもこうゆうどうでもいいテーマを真剣に考えるの大好き。
カンマ含む浮動小数点の文字列を整数に変換する
music botは実装できたので、今度はおしゃべりBOTを作っています。
日経新聞のHPから日経平均を取得して返すBOTを作ったのですが、日経平均が21,803.95と、小数点とカンマを含んだ文字列で返ってきます。
そこまで精密じゃなくて良いので、小数点を切り捨てようと思ったら意外に出来ずハマってしまいました。
単純に、int()使えばすぐやん、と思ったのですが、小数点を含む文字列をintで整数には変換できないようです。
# これは問題なく変換出来ます。 >>> int("200") 200 # 小数点があるとダメです。 >>> int("200.00") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '200.00'
なのでflaotにすればいいんじゃないかとやってみました。
# これは出来ます。 >>> float('200.00') 200.0
ならばこれで取得した日経平均をfloatにしてみます。
>>> float('21,803.95') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: could not convert string to float: '21,803.95'
なんか怒られました。
どうやら、文字列の中にカンマが含まれてるとfloatは機能してくれないようです。
忖度しろや。
てことで、replaceを使ってカンマを消してみました。
>>> float('21,803.95'.replace(',', '')) 21803.95
出来た!
ここまで出来ればあとは簡単。
>>> int(float('21,803.95'.replace(',', ''))) 21803
面倒ですが、一度floatにしてからintにする事で無事整数に変換出来ました。
カッコだらけで見づらいのでfloatの値は変数に入れてからでもいいかもですね。
再度カンマを付けたかったらformatを使えばOKです。
他にもっとスマートなやり方あるのかな?
なんかこうゆう初歩的な事が突然分からないと不安になりますが、まぁ一歩一歩やっていくしかないですね。
同じ初学者さんの参考になったら幸いです。