2013-10-14 17 views
8

Ho una lista che si compone di dettagli come questo:Ordinamento in python - come ordinare un elenco contenente valori alfanumerici?

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 

ora, voglio ordinare questa lista, in modo tale che i valori sono nel seguente ordine:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"] 

Solo facendo list1.sort() ovviamente non dà la risposta corretta - dà:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"] 

sto assumendo questo è perché tutti pitone tratta questi come stringhe direttamente. Tuttavia, desidero ordinarli in base al loro valore numerico FIRST, quindi al carattere che segue il numero.

Come procedere?

grazie mille :)

+0

Vedere questo post (http://stackoverflow.com/questions/11850425/custom-python-list-sorting) e definire una funzione di confronto personalizzata. – lurker

+2

Questo è chiamato ** natural sort **. possibile duplicato di [Python ha una funzione incorporata per l'ordinamento naturale delle stringhe?] (http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural- sorta) –

risposta

11

Si desidera utilizzare natural sort:

import re 

_nsre = re.compile('([0-9]+)') 
def natural_sort_key(s): 
    return [int(text) if text.isdigit() else text.lower() 
      for text in re.split(_nsre, s)] 

Esempio di utilizzo:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 
>>> list1.sort(key=natural_sort_key) 
>>> list1 
['1', '2C', '36', '100A', '132', '302F', '342B'] 

Questo funziona dividendo il elementi in liste che separano i numeri e li confrontano come numeri interi, invece di stringhe:

>>> natural_sort_key("100A") 
['', 100, 'a'] 
>>> natural_sort_key("342B") 
['', 342, 'b'] 

Si noti che questo funziona solo in python3 se si sono sempre confrontando int con interi e stringhe con le stringhe, altrimenti si ottiene un'eccezione TypeError: unorderable types.

+1

si noti che per Python 3 tutti gli articoli devono avere una struttura simile. '['a1', '2b']' fallirebbe con un 'TypeError'. –

+0

@StevenRumbalski: ah me ne sono dimenticato, grazie. Lo dirò. – Claudiu

0

Beh, devi trovare un modo per convertire le stringhe in numeri prima. Per esempio

import re 
def convert(str): 
    return int("".join(re.findall("\d*", str))) 

e poi lo si utilizza come una chiave di ordinamento:

list1.sort(key=convert) 
+0

ci sono alcune soluzioni di ordinamento più naturali qui: http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – nofinator

Problemi correlati