ネストされたDictionary型
まずは、ネストされたDictionary型のデータを作成します。
Python
import json
data = {
'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}
print(json.dumps(data, indent=4))
このように出力されます。
{
"Ken": {
"Country": "US",
"Job": "Artist",
"Age": 56
},
"Alan": {
"Country": "Japan",
"Job": "Carpenter",
"Age": 27
},
"Steven": {
"Country": "China",
"Job": "Artist",
"Age": 40
}
}
Dictionaryの第1階層でソート
第1階層でソートしてみます。
Dictionary型のソートには key=lambda を使います。
第1階層のソートでは、その後に x:x[0] と書きます。
Python
import json
data = {
'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}
# 第1階層のKEYで昇順でソートする。
data = dict(sorted(data.items(),
key=lambda x:x[0],
reverse=False))
print(json.dumps(data, indent=4))
第1階層のキーをアルファベット順の昇順で、Alan → Ken → Steven と出力できています。
{
"Alan": {
"Country": "Japan",
"Job": "Carpenter",
"Age": 27
},
"Ken": {
"Country": "US",
"Job": "Artist",
"Age": 56
},
"Steven": {
"Country": "China",
"Job": "Artist",
"Age": 40
}
}
Dictionaryの第2階層でソート
第2階層の "Age" キーでソートしてみます。
第2階層のソートでは、key=lambda x:x[1]["ソートに使うKEY"] とします。
Python
import json
data = {
'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}
# 第2階層の"Age"キーで昇順でソートする。
data = dict(sorted(data.items(),
key=lambda x:x[1]['Age'],
reverse=False))
print(json.dumps(data, indent=4))
第2階層の "Age" キーを昇順で、27 → 40 → 56 と出力できています。
{
"Alan": {
"Country": "Japan",
"Job": "Carpenter",
"Age": 27
},
"Steven": {
"Country": "China",
"Job": "Artist",
"Age": 40
},
"Ken": {
"Country": "US",
"Job": "Artist",
"Age": 56
}
}
Dictionaryの第2階層を複数キーでソート
第2階層の複数のキーでソートしてみます。
優先順位は "Job", "Country" の順とします。
第2階層の複数キーのソートでは、key=lambda x:(x[1]["第1優先KEY"], x[1]["第2優先KEY"]) とします。
2つ以上の複数キーの場合、さらにカンマでつなげるだけです。
Python
import json
data = {
'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}
# 第2階層の複数キーで昇順でソートする。
data = dict(sorted(data.items(),
key=lambda x:(x[1]['Job'], x[1]['Country']),
reverse=False))
print(json.dumps(data, indent=4))
Steven と Ken の "Job" は "Artist" なので同じですが、"Country" キーが "China" の Steven の方が上にソートできています。
{
"Steven": {
"Country": "China",
"Job": "Artist",
"Age": 40
},
"Ken": {
"Country": "US",
"Job": "Artist",
"Age": 56
},
"Alan": {
"Country": "Japan",
"Job": "Carpenter",
"Age": 27
}
}
わかりにくい場合は、降順に切り替えてみる (reverse=True に変更する) と違いがわかります。
Python
import json
data = {
'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}
# 第2階層の複数キーで降順でソートする。
data = dict(sorted(data.items(),
key=lambda x:(x[1]['Job'], x[1]['Country']),
reverse=True))
print(json.dumps(data, indent=4))
{
"Alan": {
"Country": "Japan",
"Job": "Carpenter",
"Age": 27
},
"Ken": {
"Country": "US",
"Job": "Artist",
"Age": 56
},
"Steven": {
"Country": "China",
"Job": "Artist",
"Age": 40
}
}