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

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

ただいまの
回答率

90.35%

  • Python

    9133questions

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

辞書の2つのkeyを使いvalueを小さいもの順に並べたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 347
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

辞書の2つのkeyを使いvalueを小さいもの順に並べたい。
今dct変数に

{‘A’:{‘a:0.02,’b:0.03,’c:0.01,’d’:[0.04,0.05]},‘B’:{‘a:0.4,’b:0.2,’c:0.8,’e:0.9},‘C’:{‘a:0.1,’b:0.07,’h:0.6,’j:0.9},‘D’:{‘h:1.2,’j:1.5,’k’:[1.3,1.8],’l:1.8},‘E’:{‘o:11,’p:12,’q:16,’r:18}}


という辞書がある。
このdct辞書のA・B・C・Dの要素のvalueの中の入れ子の辞書のvalueを小さい順に並べたい。そして、入れ子の辞書のvalueがリスト型のもの(例えば、Aのvalueの’d’:[0.04,0.05]やのvalueの’k’:[1.3,1.8])はソートに含めない。
例えば、
Aの辞書をソートするなら、
’c’:0.01、‘a’:0.02、’b’:0.03という順にソートされる。
最終的なアウトプットはprint文で、

A:’c:0.01a:0.02
B:’b:0.2a:0.4
     ・
     ・
     ・


のように小さいものの上位2つまでを出力させたい。

 発生している問題・エラーメッセージ

特にエラーは発生していない。

 該当のソースコード

for key,value in dct.iteritems():
  if type(value) == list:
      for k, v in sorted(value.items(), key=lambda x: x[1]):
        print(str(k) + ": " + str(v))


のように書けばできると思ったが、小さいものの上位2つを取ってくる方法がわからなかった。

 試したこと

上記のコードの実行

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/04/25 17:45

    python2ですか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/04/25 17:49

    python3です

    キャンセル

  • fuzzball

    2018/04/25 17:55

    3だとiteritems()が使えないと思いますが?

    キャンセル

回答 2

checkベストアンサー

0

一番安直な方法は、スライスを使ってsortedの結果を途中まで取り出すことです。

dct = {"A":{"a":0.02,"b":0.03,"c":0.01,"d":0.08},"B":{"a":0.4,"b":0.2,"c":0.8,"e":0.9},"C":{"a":0.1,"b":0.07,"h":0.6,"j":0.9},"D":{"h":1.2,"j":1.5,"k":1.4,"l":1.8},"E":{"o":11,"p":12,"q":16,"r":18}}


for key,value in dct.items():
    print(key)
    for k, v in sorted(value.items(), key=lambda x: x[1])[:2]:
        print(str(k) + ": " + str(v))

ところで質問文のコード、文字列のクオートが‘’で囲まれているのはおかしいし、全角スペースがインデントに混ざっていました。いろいろ気を配ったほうが良いと思いました。

 追記

質問文を編集されたので、それに対応したものを。

dct = {"A":{"a":0.02,"b":0.03,"c":0.01,"d":[0.04,0.05]},"B":{"a":0.4,"b":0.2,"c":0.8,"e":0.9},"C":{"a":0.1,"b":0.07,"h":0.6,"j":0.9},"D":{"h":1.2,"j":1.5,"k":[1.3,1.8],"l":1.8},"E":{"o":11,"p":12,"q":16,"r":18}}

for key,value in sorted(dct.items(), key=lambda x:x[0]): # せっかくなのでABC順に並べる
    print(key)
    value_count = 0
    for k, v in sorted([(k, v) for k,v in value.items()
                        if type(v) is not list], # ここに型チェック入れた
                       key=lambda x: x[1])[:2]:
        print(str(k) + ": " + str(v))


質問文に掲載された位置で型チェックしても大した意味はなく、子辞書の値を型チェックしてやる必要があります。とりあえず値がlistのものはリスト内包表記でfilterして取り除きました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 17:49

    ありがとうございます。すみません、もしかして修正前の質問に対して答えてくださいましたか?リストチェックの部分が記載されていなかったもので。。。

    キャンセル

  • 2018/04/25 17:51

    あらまあ、そのようですね。追記しときます

    キャンセル

  • 2018/04/25 18:04

    ありがとうございます!!大変わかりやすかったです!!

    キャンセル

0

興味があったのと独力で書いたので、一応アップしておきます。

data = \
{'A':{'a':0.02,'b':0.03,'c':0.01,'d':[0.04,0.05]},
 'B':{'a':0.4,'b':0.2,'c':0.8,'e':0.9},
 'C':{'a':0.1,'b':0.07,'h':0.6,'j':0.9},
 'D':{'h':1.2,'j':1.5,'k':[1.3,1.8],'l':1.8},
 'E':{'o':11,'p':12,'q':16,'r':18}
}
for key_outer, data_dict in sorted(data.items(), key=lambda x: x[0]):
    print(key_outer, data_dict)
    data_dict_new = {}  # リストを含まない辞書
    for key_inner in data_dict.keys():  # リストを除去
        if type(data_dict[key_inner]) is not list:
            data_dict_new[key_inner] = data_dict[key_inner]
    for key_inner, value in sorted(data_dict_new.items(), key=lambda x: x[1]):
        print(" ", key_inner, value)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Python

    9133questions

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