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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

646閲覧

リストの要素を手入力し、"一番後ろのstr型の要素"を指定したいです。

fc4ll

総合スコア20

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/08 16:38

編集2021/10/20 01:22

リスト内に様々な要素を手入力し、全て打ち込み終わった後に”stop"と入力したら、一番うしろの文字列(str型)をprintしたいです。。
例「43, banana, 12, 554, soccer, 71」 という5つの要素(banana, soccerはstr型、数字はint型)を打ち込み、"stop"と入力したら、「soccer」とprintされる

ーーーーーーーーーーーーーーーーーーーーー

python

1get_last_string = [] 2 3while True: 4 x = input("入力が完了したら'stop'と入力してください。") 5 if x == 'stop': 6 break 7 get_last_string.append(x) 8 9i = len(get_last_string) 10a = int(i) - 1 11 12for a in get_last_string: 13 if isinstance(get_last_string[a], str): 14 print(get_last_string[a]) 15 break 16 else: 17 a = a - 1 18 19 if a == 0: 20 print("文字列が入力されていません。") 21

ーーーーーーーーーーーーーーーーーーーーー

上記のコードを書いたのですが、
「 11
12 for a in get_last_string:
---> 13 if isinstance(get_last_string[a], str):
14 print(get_last_string[a])
15 break

TypeError: list indices must be integers or slices, not str」
というエラーが出ます。
a はint型に変換したはずなのですが、何が原因なのでしょうか?

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

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

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

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

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

guest

回答2

0

まず、

python

1a = int(i) - 1

のaと

python

1for a in get_last_string

のaは違います。前者は普通に数字が代入されますが、後者は繰り返しにおいてリストget_last_stringの各要素が入ります。
例)

a = 10 lista = [1,2,3] for a in lista: print(a)

1
2
3

for文の中で

python

1if isinstance(get_last_string[a], str):

と、「各要素」が代入されているaをインデックス番号として使おうとしているので、エラーが出ています。

また、input関数は常にstr型を返すので、注意が必要です。
例)

python

1a = input("入力") 2print(isinstance(a, str))

入力→1
出力→True

つまり、リストの各要素が「strかどうか」ではなく、「int(などの数値)に変換できるか」を判定する必要があります。

入力が十進数と文字列のみを想定しているのであれば。isdecimalなどが使えます。少数なども想定する場合は、例外処理などを用いて行うことになります。

python

1get_last_string = [] 2 3while True: 4 x = input("入力が完了したら'stop'と入力してください。") 5 if x == 'stop': 6 break 7 get_last_string.append(x) 8get_last_string.reverse() 91 10 11for item in get_last_string: 12 if not item.isdecimal(): 13 print(item) 14 break 15else: 16 print("文字列が入力されていません") 17

投稿2021/10/08 18:06

Henjin213

総合スコア22

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

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

fc4ll

2021/10/09 19:16

頂いたコードで目的通りに動作しました! for文の前にリストの要素を逆転させるのではなく、for文の中で一番うしろの要素から一つずつ遡る方法はありますか?
guest

0

目的のPGを作成するためには、いくつか問題がありそうです。
例えば次のように、まずは1つ1つの処理が何をやっているか確認してみたら良いと思います。

python

1get_last_string = [] 2 3while True: 4 x = input("入力が完了したら'stop'と入力してください。") 5 if x == 'stop': 6 break 7 get_last_string.append(x) 8 9print(get_last_string) # get_last_stringはどうなっているでしょうか? 10 11i = len(get_last_string) 12print(i) # iはどうなっているでしょうか? 13 14a = int(i) - 1 15print(a) # aはどうなっているでしょうか? 16 17for a in get_last_string: 18 print(a) # aはどうなっているでしょうか? 19 print(type(a)) # aの型は何でしょうか? 20 21 if isinstance(get_last_string[a], str): 22 print(get_last_string[a]) 23 break 24 else: 25 a = a - 1 26 27 if a == 0: 28 print("文字列が入力されていません。")

ちなみに、list indices must be integers or slices, not strのエラーは、

「リストのインデックスには数値かスライスを指定するべきです。文字列はだめ!」

という意味です。スライスというのはget_last_string[0:4]みたいに書く方法ですね。

投稿2021/10/08 17:18

ukyoda

総合スコア386

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問