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

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

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

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

Q&A

解決済

3回答

586閲覧

(python)リストのif文がうまく分岐できない

inkyakirai

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/12/17 12:54

前提・実現したいこと

文字データの0~10のラベルを作り、
5,7,9は'あ'
3,6,8は'い'
0,1,2,4は'う'
を出力するプログラムを作成したいです。

出力結果

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 1 ['あ', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 2 ['あ', 'あ', '2', '3', '4', '5', '6', '7', '8', '9'] 3 ['あ', 'あ', 'あ', '3', '4', '5', '6', '7', '8', '9'] 4 ['あ', 'あ', 'あ', 'あ', '4', '5', '6', '7', '8', '9'] 5 ['あ', 'あ', 'あ', 'あ', 'あ', '5', '6', '7', '8', '9'] 6 ['あ', 'あ', 'あ', 'あ', 'あ', 'あ', '6', '7', '8', '9'] 7 ['あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', '7', '8', '9'] 8 ['あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', '8', '9'] 9 ['あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', '9'] ['あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ', 'あ']

該当のソースコード

python

1label = ['0','1','2','3','4','5','6','7','8','9'] 2 3domain = ['0','1','2','3','4','5','6','7','8','9'] 4 5 6for i in range(10): 7 if label[i] == '5' or '7' or '9' : 8 print(label[i]) 9 print(domain) 10 domain[i] = 'あ' 11 12 elif label[i] == '3' or '6' or '8' : 13 domain[i] = 'い' 14 15 else: 16 domain[i]='う' 17 18domain

###問題点
何故か出力が全て「あ」になってしまう。
また、2行目のdomainだが
domain = []
で空のリストを作成すると
IndexError: list assignment index out of range
と出てうまくいかない。
試したことでかなりアナログな書き方をしているが、効率の良い書き方を知りたい。

試したこと

試したこととしては、elifを作りかなり無理やりコードを書いたところ正しい出力になりました。

python

1label = ['0','1','2','3','4','5','6','7','8','9'] 2print(label[3]) 3domain = ['0','1','2','3','4','5','6','7','8','9'] 4print(domain[2]) 5 6for i in range(10): 7 if label[i] == '5': 8 domain[i] ='a' 9 elif label[i] == '7': 10 domain[i] = 'a' 11 elif label[i] == '9': 12 domain[i] = 'a' 13 elif label[i] == '3': 14 domain[i] = 'i' 15 elif label[i] == '6': 16 domain[i] = 'i' 17 elif label[i] == '8': 18 domain[i] = 'i' 19 else: 20 domain[i] = 'u'

###出力結果

['u', 'u', 'u', 'i', 'u', 'a', 'i', 'a', 'i', 'a']

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答3

0

python

1 if label[i] == '5' or '7' or '9' :

python

1 if label[i] == '5' or label[i] == '7' or label[i] == '9' :

に変更しましょう。elifも同様に変更してください。

投稿2021/12/17 13:02

ppaul

総合スコア24670

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

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

0

ベストアンサー

pythonでこういう書き方はできません。

python

1if label[i] == '5' or '7' or '9' :

これは、こう書く必要があります。

python

1if label[i] == '5' or label[i] == '7' or label[i] == '9' :

質問の書き方をした場合、'7'も'9'もFalseでないので、Trueとなり、ぜんぶ'あ'になる原因になっています。


こういう書き方の方がわかりやすいことを思いだしました。

python

1if label[i] in ['5', '7', '9']:

投稿2021/12/17 12:59

編集2021/12/17 13:14
TakaiY

総合スコア13790

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

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

0

こういう変換系の処理はこんなかんじにするのもいいですよ。

python

1label = ['0','1','2','3','4','5','6','7','8','9'] 2 3domain = ['0','1','2','3','4','5','6','7','8','9'] 4 5f = ['う','う','う','い','う','あ','い','あ','い','あ'] 6 7for i in range(10): 8 domain[i] = f[int(label[i])] 9 10print(domain)

--- 追記 ---
domain を空配列で初期化した場合はこんなかんじで

python

1 domain.append(f[int(label[i])])

投稿2021/12/17 13:38

編集2021/12/17 13:44
takasima20

総合スコア7464

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

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

ppaul

2021/12/17 14:53

{'0': 'う', '1': 'う', '2': 'う', '3': 'い', '4': 'う', '5': 'あ', '6': 'い', '7': 'あ', '8': 'い', '9': 'あ'} の方が性能は良いです。
takasima20

2021/12/17 20:48

アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問