4

(ここでは 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 を返すカスタム関数を実装し、次のように呼び出すことです。この機能:absort()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)

これはあまりエレガントではありません。

4

1 に答える 1

2

getSortKey正しい値で内部的に呼び出す独自のキーを使用できます。

>>> import icu
>>> dei = [{'name': u'Thor'}, {'name': u'Œdipus'}, {'name': u'Creon'}]
>>> collator = icu.Collator.createInstance()
>>> dei.sort(key=lambda x: collator.getSortKey(x['name']))
>>> dei
[{'name': 'Creon'}, {'name': 'Œdipus'}, {'name': 'Thor'}]
于 2016-08-05T16:47:34.927 に答える