[英]Python sort a list of objects/dictionaries with a given sortKey function
(我在這里使用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之間。
按照這個建議 ,我使用PyICU的collator.getSortKey collator.getSortKey()
函數(讓它重命名為sortKey()
以便於閱讀),它以strings
的列表strings
的形式工作:
strings.sort(key=sortKey)
我的問題在這里:因為我無論如何都無法修改sortKey()
函數,如何根據某些屬性使用它來排序更復雜的對象(這里是字典)列表?
我目前找到的唯一方法是在單獨的列表中提取字典的值,對其進行排序,然后實現自定義compare(a, b)
函數,根據a
和b
的索引返回-1,0或1在單獨的列表中,並使用此compare()
函數調用sort()
:
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)
我覺得不是很優雅。
您可以使用自己的密鑰在內部調用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'}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.