Python使用给定的sortKey函数对对象/字典列表进行排序

时间:2016-08-05 16:15:02

标签: python sorting dictionary pyicu

(我在这里使用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'}]

虽然我希望Œdipus介于Creon和Thor之间。

关注this suggestion,我使用PyICU的collator.getSortKey()函数(让它重命名为sortKey()以提高可读性),这样就可以在字符串列表strings上运行:

strings.sort(key=sortKey)

我的问题在于:因为我无论如何都无法修改sortKey()函数,如何根据某些属性使用它来对更复杂的对象(此处为字典)进行排序?

我目前发现的唯一方法是在单独的列表中提取字典的值,对其进行排序,然后实现自定义compare(a, b)函数,返回-1,0或1,具体取决于{的索引单独列表中的{1}}和a,并使用此b函数调用sort()

compare()

我觉得不太优雅。

1 个答案:

答案 0 :(得分:0)

您可以使用自己的密钥在内部调用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'}]