的列表(我使用Python 2此處)Python的排序一個給定的SORTKEY函數對象/字典
我有字典的名單,說
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'}]
,而我想戀母是克瑞翁和托爾之間。
繼this suggestion,我用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)
,我不覺得很優雅。
的問題都不是關鍵。問題是你不同意字母順序的python。如果'ae'符號在您的語言中出現在'c'之後,您可以使用本地化嗎?否則,你必須提供比較函數,告訴它按字母排序的順序。但是,提供你的比較功能只是幾個確切的單詞似乎是短視的。 –
是的,按字母順序排序是依賴於語言的,這就是爲什麼我要使用PyICU,它精確地爲任何語言實現它。 – Eoshyn