(ここでは Python 2 を使用しています)
私は辞書のリストを持っています
dei = [{'name': u'Thor'}, {'name': u'Œdipus'}, {'name': u'Creon'}]
'name'
そのリストを属性でソートしたいと思います。これは簡単に行うことができます:
dei.sort(key=lambda d: d['name'])
ここで、Python のアルファベット順のソートは ASCII 駆動であるため、結果は次のようになります。
[{'name': u'Creon'}, {'name': u'Thor'}, {'name': u'Œdipus'}]
私はエディプスがクレオーンとトールの間にあることを望みます.
この提案に従って、PyICU のcollator.getSortKey()
関数を使用します (読みやすいように名前を変更しましょう)。これは、文字列sortKey()
のリストに対して次のように機能します。strings
strings.sort(key=sortKey)
ここでの私の問題:sortKey()
とにかく関数を変更できないため、それを使用して、属性に従ってより複雑なオブジェクト (ここでは辞書) のリストをソートするにはどうすればよいですか?
現時点で私が見つけた唯一の方法は、辞書の値を別のリストに抽出してソートし、別のリストのとcompare(a, b)
のインデックスに応じて -1、0、または 1 を返すカスタム関数を実装し、次のように呼び出すことです。この機能:a
b
sort()
compare()
names = sorted([d['name'] for d in dei], key=sortKey)
def compare(a, b):
if names.index(a) < names.index(b):
return -1
elif names.index(a) > names.index(b):
return 1
else:
return 0
results = dei.sort(key=lambda d: d['name'], cmp=compare)
これはあまりエレガントではありません。