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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6451questions

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

python3 入力データの辞書化 および ソートについて

解決済

回答 2

投稿

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

zeitaku_fire

score 18

コード自体は完成していて動いています。
しかし、イケてないコードだと思うので、アドバイスいただきたいです。

(悩み1)
入力データをリスト化して、その後、辞書としています。
現状、無駄にコードが長くなってしまっていると感じています。

player = list(map(str, input().split(" ")))   
#['佐藤', '田中']
player_ans= {}

for i in player:
    player_ans[i]=0
#{'佐藤': 0, '田中': 0}

入力データ:佐藤 田中

いつもは、下記コードを使って、入力データを辞書としていました。
しかし、これだとキーに値をいれることができなかったので、リスト化して辞書を作成する、上記コードとしました。

#今回は使用していないが、いつもは下記で入力データの辞書作成
player = set(map(str, input().split(" "))) 
#{'佐藤', '田中'}

■質問1:
リスト化せずとも、辞書(値を入れられる辞書)を作成できると思うのですが、方法はございますでしょうか?

(悩み2)
上記で作成した辞書に値を追加して、ソートして出力しました。
尚、出力したい結果は、keyのみです。

#↓値を追加した辞書
{'佐藤': 10, '田中': 50}

#辞書の値で降順にソート。ソート後の値をiに
for i in sorted(player_ans.items(),reverse=True, key=lambda x: x[1]):
    print(i) #('田中', 50) ('佐藤', 10)
    print(i[0]) #田中 佐藤


■質問2:
print(i)で出力した結果がタプルになっていたので、やむを得ずprint(i[0])として、
keyを出力しました。しかし、これだと見直したときにわかりにくい気がするので、ほかにいい方法はありますでしょうか?
抽象的で申し訳ないのですが、「print(i[0]) ※タプルの0番目を指定」というのが気に入らないです。。

下記のようなことをできればなと考えています。
辞書の値で降順ソート ⇒ 並び替えた辞書のキーを出力(keysを使う?)

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+4

リスト化せずとも、辞書(値を入れられる辞書)を作成できると思うのですが、方法はございますでしょうか?

  • 一時変数を作らない方法
for name in input().split():
    player_ans[name] = 0
  • 辞書内包表記
player_ans = {name: 0 for name in input().split()}

print(i)で出力した結果がタプルになっていたので、やむを得ずprint(i[0])として、
keyを出力しました。しかし、これだと見直したときにわかりにくい気がするので、ほかにいい方法はありますでしょうか?

  • アンパック
for key, value in sorted(player_ans.items(), reverse=True, key=lambda x: x[1]):
    print(key)
from operator import itemgetter

for key, value in sorted(player_ans.items(), reverse=True, key=itemgetter(1)):
    print(key)
  • 最初からキーだけを利用する方法
for key in sorted(player_ans, reverse=True, key=lambda k: player_ans[k]):
    print(key)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/28 12:29

    遅い時間に、ご回答いただきありがとうございます。
    悩み解決しました。

    キャンセル

+1

悩み1

  • input().split(" ")はstrなのでmap(str, ...)は不要
  • 辞書の内包記法を使う
player_ans = {p: 0 for p in input().split(" ")}

悩み2

  • key=をうまく使う
for player in sorted(player_ans, reverse=True, key=player_ans.get):
    print(player)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Python 3.x

    6451questions

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