PythonでDictionary型のネスト部分でソートしたい

ネストされた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
    }
}