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

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

ただいまの
回答率

90.75%

  • Python

    6841questions

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

辞書を小さいもの順にソートしたい

解決済

回答 2

投稿

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

k0908

score 51

辞書を小さいもの順にソートしたい。
df変数に

{"A": [{"a": 100}, {"b": 200}, {"c": 300}], "B": [{"a": 400}, {"b": 500}, {"c": 80}], "C": [{"a": 340}, {"b": 600}, {"c": 130}], "D": [{"a": 250}, {"b": 390}, {"c": 220}]}


と内容が入っている。
このdf辞書をソートして

A→ a: 100 b: 200 c: 300

B→ c: 80 a: 400 b: 500

C→ c: 130 a: 340 b: 600

D→ c: 220 a: 250 b: 390


のように出力したい。

for key, value in sorted(results.items()):
        print( key + "→")
        for ky,vl in sorted((ky, vl) for ky,vl in value.items(), key=lambda x: x[1]):
            print(ky + ":" + vl)


とコードを書いて実行すると、
SyntaxError: Generator expression must be parenthesized if not sole argument
とエラーが出た。
何が間違っているのだろうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • quiqui

    2018/05/10 13:14

    エラーメッセージを読んだのでしょうか?

    キャンセル

回答 2

+2

for key, value in sorted(results.items()):
        print( key + "→")
        for ky,vl in sorted((ky, vl) for ky,vl in value.items(), key=lambda x: x[1]):
            print(ky + ":" + vl)

とコードを書いて実行すると、
SyntaxError: Generator expression must be parenthesized if not sole argument
とエラーが出た。
何が間違っているのだろうか?

ジェネレータ式とは本来リスト内包表記の外側を丸かっこに変えた見た目のものですが、pythonには関数の中に単一の引数として渡される場合は丸かっこを省略して書くことができるという糖衣構文があります。

今回はsorted関数に他の引数(key)を指定しているので駄目です。

これを直すと、こうなります(ついでにインデントも修正)。

for key, value in sorted(results.items()):
    print( key + "→")
    for ky,vl in sorted(((ky, vl) for ky,vl in value.items()), key=lambda x: x[1]):
        print(ky + ":" + vl)

これは3行目でAttributeError: 'list' object has no attribute 'items'が出ます。しょうがないですね。valueはlistなので。

データ構造を変えるのがスジですが、そっちの回答はLouiS0616さんが載せているので、敢えてそのままやるとすると、こうかな。

for key, value in sorted(results.items()):
    print( key + "→")
    for ky,vl in sorted([list(d.items())[0] for d in value],
                        key=lambda x: x[1]):
        print(ky + ":" + vl)

まだ走りません。printのところでTypeError: Can't convert 'int' object to str implicitly
が出ます。以下のようにするとやっと走ります。

for key, value in sorted(results.items()):
    print( key + "→")
    for ky,vl in sorted([list(d.items())[0] for d in value],
                        key=lambda x: x[1]):
        print(ky + ":" + str(vl))
"""  # =>
A→
a:100
b:200
c:300
B→
c:80
a:400
b:500
C→
c:130
a:340
b:600
D→
c:220
a:250
b:390
"""

期待値と違う出力になるので、調整。

for key, value in sorted(results.items()):
    print( key + "→", end=" ")
    for ky,vl in sorted([list(d.items())[0] for d in value],
                        key=lambda x: x[1]):
        print(ky + ": " + str(vl), end=" ")
    print("\n")
"""  # =>
A→ a: 100 b: 200 c: 300 

B→ c: 80 a: 400 b: 500 

C→ c: 130 a: 340 b: 600 

D→ c: 220 a: 250 b: 390 

"""

pythonの構文や、自分で作った変数の型をしっかり理解してプログラミングしてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

dfのデータ構造がごちゃごちゃしているので、それを少し整理できれば素直に書けます。

from operator import itemgetter

df = {
    "A": {"a": 100, "b": 200, "c": 300},
    "B": {"a": 400, "b": 500, "c":  80},
    "C": {"a": 340, "b": 600, "c": 130},
    "D": {"a": 250, "b": 390, "c": 220}
}

for key, value in sorted(df.items()):
    print(f'{key}→', end=' ')
    for k, v in sorted(value.items(), key=itemgetter(1)):
        print(f'{k}:{v}', end=' ')

    print()

実行結果 Wandbox

A→ a:100 b:200 c:300
B→ c:80 a:400 b:500
C→ c:130 a:340 b:600
D→ c:220 a:250 b:390

このアプローチの方が結果的には楽だと思うので、dfの作り方を工夫してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/10 13:51

    ありがとうございます。dfのデータ構造はどのようにコードを書けばLouis0616さんのように整理できますか?辞書を変形するコードを書いたのですが、うまくいかず・・・。

    キャンセル

  • 2018/05/10 14:05

    成形する方法でも良いですが、一番いいのは辞書を作る段階で扱いやすい形を意識することです。
    dfはもともとどのように作ったのでしょう?

    キャンセル

  • 2018/05/10 14:13

    {"a": 100}、{"b": 200}、{"c": 300}と配列の要素があって、それを
    arr=["A","B","C","D"]
    for i in range(len(arr)):
    fi = {}
    fi[i] = dic #{"a": 100}、{"b": 200}、{"c": 300}を入れる という形で作っています。

    キャンセル

  • 2018/05/10 14:22

    もともとの『{"a": 100}、{"b": 200}、{"c": 300}』は違う形で受け取れないのですか?
    単一要素の辞書のリストは使いづらいですし、意味合い的にも不可解です。

    キャンセル

  • 2018/05/10 15:37

    何とか自分でできました!
    ありがとうございます。

    キャンセル

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

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

関連した質問

  • 解決済

    「3 Coins Shop」の商品価格

    前提・実現したいこと 注)困っていることではありません。好奇心からの質問です。 下記のような課題があったとします。 1円、5円、10円、50円、100円、500

  • 解決済

    opencvの動画再生について

    opencvで動画を再生させるときにキー入力によって再生する位置を変えようとしています。コードは以下のようになっています。エラーなく動きますがとても動画の速さが遅くなります。またキ

  • 解決済

    プログラミング 配列

    include <stdio.h> main(){ int a[] = {100,200,300,400,500,600,700,800,900,1000}; int i; for

  • 解決済

    Jquery でinput のvalue値を取得しようとするとundefinedになってしまう

    一覧をチェックして重複登録しないように仕組みを検討してます。 <div id="member"> <input type="checkbox" class="members

  • 解決済

    paddingの見抜き方を教えて下さい

    <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv=

  • 解決済

    Opencv cv2.lineがでてこない。

    今opencvを使って線を表したいのですができません。言語はpython3です。 3重配列の要素を繋げたいのですがエラーはでないのに動画を再生すると 線が出て来ますせん。どこがいけ

  • 解決済

    構造の異なる辞書をソートしたい

    構造の異なる辞書をソートしたい。 辞書dfには df = [{"A":{"A1":{"a1":100,"b1":200,"c1":300}}},{"B":{"B1":{"a2"

  • 解決済

    数値の分割(ruby)

     前提・実現したいこと 数値を一定の値ごとに分割したいです。 rubyです。 例えば500を100ごとに分解した場合は、 [0,100,200,300,400,500]の結果が

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

  • Python

    6841questions

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