2016-08-05 107 views
3

的列表(我使用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取決於ab在索引單獨的列表,並調用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) 

,我不覺得很優雅。

+1

的問題都不是關鍵。問題是你不同意字母順序的python。如果'ae'符號在您的語言中出現在'c'之後,您可以使用本地化嗎?否則,你必須提供比較函數,告訴它按字母排序的順序。但是,提供你的比較功能只是幾個確切的單詞似乎是短視的。 –

+0

是的,按字母順序排序是依賴於語言的,這就是爲什麼我要使用PyICU,它精確地爲任何語言實現它。 – Eoshyn

回答

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'}] 
+0

https://pypi.python.org/pypi/PyICU/ –

+0

Oh sh *,it ...作品:-o 這是我嘗試過的第一件事,但我在pdb中嘗試過,因爲任何原因,wouldn在lambda中不接受'collat​​or'(全局名稱'collat​​or'未定義')。我花了一段時間才發現問題只存在於pdb中,而我完全忘了再次測試最簡單的解決方案。 謝謝! (和我一樣羞愧!) – Eoshyn