2012-01-08 14 views
6

Sto eseguendo il porting di uno script Bash su Python. Lo script imposta LC_ALL=C e utilizza il comando di ordinamento Linux per garantire l'ordine dei byte nativi anziché gli ordinamenti specifici delle impostazioni locali (http://stackoverflow.com/questions/28881/why-doesnt-sort-sort-the-same-on-every-machine).La funzione di ordinamento di Python è la stessa di quella di Linux con LC_ALL = C

In Python, desidero utilizzare le funzioni di Python sort() o sorted() (senza l'opzione key=). Otterrò sempre gli stessi risultati di Linux sort con LC_ALL=C?

+2

Quale versione di Python e quali elementi devono essere ordinati? –

risposta

7

ordinamento dovrebbe comportarsi come ci si aspetta se si passa locale.strcoll come argomento cmp per list.sort() e sorted():

import locale 
locale.setlocale(locale.LC_ALL, "C") 
yourList.sort(cmp=locale.strcoll) 
+0

Grazie a tutti. I miei dati sono tutti Unicode e ho detto "senza la chiave = opzione" perché lo uso per un altro scopo. Questa soluzione funziona alla grande. @nabucosound, la tua soluzione è interessante, ma l'installazione di PyICU è un po 'pesante per il mio scopo. Grazie ancora. – tahoar

1

Considerando che è possibile aggiungere una funzione di confronto, è possibile assicurarsi che l'ordinamento sarà equivalente a LC_ALL = C. Dai documenti, tuttavia, sembra che tutti i caratteri siano a 7 bit, quindi vengono ordinati in questo modo per impostazione predefinita, altrimenti viene utilizzato l'ordinamento specifico della locale.

Nel caso in cui si disponga di caratteri 8bit o Unicode, quindi l'ordinamento specifico delle impostazioni internazionali ha molto senso.

1

Le stringhe non Unicode in versione Python inferiore a 3 sono in realtà byte. la funzione di ordinamento e i metodi non fanno nulla per applicare le impostazioni internazionali (è necessaria la funzione del modulo locale per facilitare l'ordinamento in base alle impostazioni internazionali).

stringhe unicode e tutte le stringhe di Python 3.x non sono più byte. C'è un tipo "byte" in Python 3.

1

ho utilizzato International Components for Unicode, insieme a le associazioni PyICU, per ordinare le cose con sorted() e usando la mia propria localizzazione (catalano sul mio caso). Ad esempio, ordinare un elenco di profili utente per nome proprietà:

collator = PyICU.Collator.createInstance(PyICU.Locale('ca_ES.UTF-8')) 
sorted(user_profiles, key=lambda x: x.name, cmp=collator.compare) 
Problemi correlati