list.sort()とsorted()の違いについては触れない。
ソートするキーの指定について、こういう感じに書けるっぽい。2.7、たぶん3以降も同じ。
python2.7
from pprint import pprint
items = [
{'id':2, 'book': {'type':'zassi', 'name': u'bbb' }},
{'id':3, 'book': {'type':'manga', 'name': u'ccc' }},
{'id':4, 'book': {'type':'zassi', 'name': u'ddd' }},
{'id':1, 'book': {'type':'manga', 'name': u'aaa' }},
{'id':5, 'book': {'type':'manga', 'name': u'eee' }},
]
# ソートキーが1つ
sorted_items = sorted(
items,
key = lambda x: x['id']
)
pprint(sorted_items)
#=>
#[{'book': {'name': u'aaa', 'type': 'manga'}, 'id': 1},
# {'book': {'name': u'bbb', 'type': 'zassi'}, 'id': 2},
# {'book': {'name': u'ccc', 'type': 'manga'}, 'id': 3},
# {'book': {'name': u'ddd', 'type': 'zassi'}, 'id': 4},
# {'book': {'name': u'eee', 'type': 'manga'}, 'id': 5}]
# ソートキーが2つ以上
sorted_items = sorted(
items,
key = lambda x: (x['book']['type'], x['id'])
)
pprint(sorted_items)
#=>
#[{'book': {'name': u'aaa', 'type': 'manga'}, 'id': 1},
# {'book': {'name': u'ccc', 'type': 'manga'}, 'id': 3},
# {'book': {'name': u'eee', 'type': 'manga'}, 'id': 5},
# {'book': {'name': u'bbb', 'type': 'zassi'}, 'id': 2},
# {'book': {'name': u'ddd', 'type': 'zassi'}, 'id': 4}]
後書いてて気づいたのは、itemgetterとかattrgetterは同じ階層のしかみないっぽいので例えば -> これらは使わずにタプルで指定すればいける[{book:{},shelf:{}}, {book:{},shelf:{}}]
みたいな構造だとbookのこれとshelfのこれみたいなキーの指定はできないっぽい気がする。