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)を指定しているので駄目です。
これを直すと、こうなります(ついでにインデントも修正)。
python
1for key, value in sorted(results.items()):
2 print( key + "→")
3 for ky,vl in sorted(((ky, vl) for ky,vl in value.items()), key=lambda x: x[1]):
4 print(ky + ":" + vl)
これは3行目でAttributeError: 'list' object has no attribute 'items'が出ます。しょうがないですね。valueはlistなので。
データ構造を変えるのがスジですが、そっちの回答はLouiS0616さんが載せているので、敢えてそのままやるとすると、こうかな。
python
1for key, value in sorted(results.items()):
2 print( key + "→")
3 for ky,vl in sorted([list(d.items())[0] for d in value],
4 key=lambda x: x[1]):
5 print(ky + ":" + vl)
まだ走りません。printのところでTypeError: Can't convert 'int' object to str implicitly
が出ます。以下のようにするとやっと走ります。
python
1for key, value in sorted(results.items()):
2 print( key + "→")
3 for ky,vl in sorted([list(d.items())[0] for d in value],
4 key=lambda x: x[1]):
5 print(ky + ":" + str(vl))
6""" # =>
7A→
8a:100
9b:200
10c:300
11B→
12c:80
13a:400
14b:500
15C→
16c:130
17a:340
18b:600
19D→
20c:220
21a:250
22b:390
23"""
期待値と違う出力になるので、調整。
python
1for key, value in sorted(results.items()):
2 print( key + "→", end=" ")
3 for ky,vl in sorted([list(d.items())[0] for d in value],
4 key=lambda x: x[1]):
5 print(ky + ": " + str(vl), end=" ")
6 print("\n")
7""" # =>
8A→ a: 100 b: 200 c: 300
9
10B→ c: 80 a: 400 b: 500
11
12C→ c: 130 a: 340 b: 600
13
14D→ c: 220 a: 250 b: 390
15
16"""
pythonの構文や、自分で作った変数の型をしっかり理解してプログラミングしてください。