2014-03-05 81 views
12

以下代碼忽略語言環境,並在最後使用埃及語,出了什麼問題?使用語言環境/整理按鍵進行字典排序

dict = {"United States": "United States", "Spain" : "Spain", "England": "England", "Égypt": "Égypt"} 

import locale 

# using your default locale (user settings) 
locale.setlocale(locale.LC_ALL,"fr_FR") 
print OrderedDict(sorted(dict.items(), key=lambda t: t[0], cmp=locale.strcoll)) 

這是輸出:

OrderedDict([('England', 'England'), ('Spain', 'Spain'), ('United States', 'United States'), ('\xc3\x89gypt', '\xc3\x89gypt')]) 
+1

我不認爲你可以同時指定'key'和'cmp'。 –

+0

@Daniel實際上你可以......這只是奇怪的(鍵的結果,最終被傳遞給cmp) –

+0

這裏最大的問題是不清楚'locale'對'fr_FR'的編碼是什麼。 –

回答

0

這裏有一個變通。

使用Unicode的範式標準分解http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms

# utf-8 <-> unicode is left as exercise to the reader 
egypt = unicodedata.normalize("NFD", egypt) 

sorted(['Egypt', 'E\xcc\x81gypt', 'US']) 
['Egypt', 'E\xcc\x81gypt', 'US'] 

這實際上並不需要語言環境考慮。

除此之外,嘗試更新的Python(是的,我知道)或來自Martijn的鏈接問題和相應答案的ICU庫。

1

考慮以下...

import unicodedata 
from collections import OrderedDict 
dict = {"United States": "United States", "Spain" : "Spain", "England": "England", "Égypt": "Égypt"} 

import locale 

# using your default locale (user settings) 
locale.setlocale(locale.LC_ALL,"fr_FR") 

print OrderedDict(sorted(dict.items(),cmp= lambda a,b: locale.strcoll(unicodedata.normalize('NFD', unicode(a)[0]).encode('ASCII', 'ignore'), 
                     unicodedata.normalize('NFD', unicode(b)[0]).encode('ASCII', 'ignore')))) 
+0

真要有一個更好的解決方案,而不是僅僅爲了改變語言環境而編寫一段代碼。 –

+0

還應該注意的是,設置語言環境可能會影響Python實例的其他部分。 –

相關問題