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

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

ただいまの
回答率

90.48%

  • Python 3.x

    6981questions

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

python3 条件演算子について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 141

zeitaku_fire

score 18

taisyou = [ 1 if i =="!" else 10 if i == "?" else 0 if i == "+" else i for i in (list(input()))]
print(taisyou) #[1, 10, 0, 1, 1, 10, 10, 0, 1, 1, 10, 10]
print(sum(taisyou)) #55

#入力データ !?+!!??+!!??


『概要』
入力データの内、
・! のときは、リストに1
・? のときは、リストに10
・+ のときは、リストに0
最後にsumを使って合計を出しています。

『質問』
入力データの内必要なのは、!と?だけです。
+については不要なので、無視したいのですが、やり方がわからず、ifをつかって仕方なく0を入れるようにしています。
今回に関して、不要なのは、+だけだったので、ifを書いて解決しましたが、今後不要な入力データが増えたとき、その数だけifを書くのは手間と思いました。
下記のようなことをやりたいのですが、いい方法はありますでしょうか?

taisyou = [ 1 if i =="!" else 10 if i == "?" else i for i in (list(input()))] 
#!と?だけifでかく。ほかの入力データは不要。こんなコードにしたいが、これだと望んだ動きをしない。

print(taisyou) #[1, 10, 1, 1, 10, 10, 1, 1, 10, 10] #希望する出力
print(sum(taisyou)) #55

#入力データ !?+!!??+!!??
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2018/06/28 17:15

    リスト内包表記([~])だけで完結させたいということでしょうか?あまりに複雑な条件の場合、素直にメソッドを作ったほうが良いと思いますが、制約がありますか?

    キャンセル

回答 3

checkベストアンサー

+2

[ 1 if i =="!" else 10 if i == "?" else i for i in (list(input())) if i == "!" or i == "?"]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/28 17:33

    ありがとうございます。末尾に対象を記載(今回では、!と?)することで、ほかは無視されるコードと解釈しました。今後ともよろしくお願いします。

    キャンセル

+2

細かいところですが、(list(input()))の外側のlistとかっこ不要かな・・・単にinput()でいいはず。

ということで、こんな感じでどうですか。
その他ならiにするという規定がなければ、条件演算子をもう1つ減らせます。

s = "!?+!!??+!!??"
taisyou = [1 if i =="!" else 10 if i == "?" else i 
           for i in s
           if i != "+"]
print(taisyou)
print(sum(taisyou))

でも、そもそも条件演算子で書くのは悪夢なので、

s = "!?+!!??+!!??"
conv_dict = {"!":1, "?":10}
taisyou = [conv_dict.get(i, i)  # get(i, i)でまずconv_dict[i]を試み、存在しなければiを返す 
           for i in s
           if i != "+"]
print(taisyou)
print(sum(taisyou))

さらに、除外したいものが複数ある場合、

s = "!?+!-!??-+!-!??"
conv_dict = {"!":1, "?":10}
exc_set = {"+", "-"}
taisyou = [conv_dict.get(i, i) 
           for i in s
           if i not in exc_set]
print(taisyou)
print(sum(taisyou))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/28 17:30

    >>細かいところですが、(list(input()))の外側のlistとかっこ不要かな・・・単にinput()でいいはず。
    ありがとうございます。inputだけだと、一行まるまる取り込まれると勘違いしておりました。。
    ご指摘のとおり不要でした。削除しておきます。
    また、辞書を使ってやる方法について、ご教授いただきありがとうございます。

    キャンセル

+2

変換元の文字数が1文字限定ならstr.maketransが使えるかと。

s = input()
table = str.maketrans({
    '!': '1 ',
    '?': '10 ',
    '+': ' ',
})
result = s.translate(table)
ar = list(map(int, result.strip().split()))
print(ar)
print(sum(ar))


◇参考情報
str.maketrans

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6981questions

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