2012-04-22 5 views
79

Ho una lista di stringhe in questo modo:ordinamento senza distinzione tra maiuscole e minuscole, senza limitare il risultato?

['Aden', 'abel'] 

voglio ordinare gli elementi, maiuscole e minuscole. quindi voglio ottenere:

['abel', 'Aden'] 

ma ho l'opposto con sorted() o list.sort(), perché maiuscola appare prima in minuscolo.

Come posso ignorare il caso? Ho visto soluzioni che coinvolgono la minuscola di tutti gli elementi della lista, ma non voglio cambiare il caso degli elementi della lista.

risposta

115

le seguenti opere in Python 2:

sorted_list = sorted(unsorted_list, key=lambda s: s.lower()) 

Funziona sia per le stringhe normali che per quelle unicode, poiché entrambi hanno un metodo lower.

In Python 2 funziona per un mix di stringhe normali e unicode, poiché i valori dei due tipi possono essere confrontati tra loro. Python 3 non funziona così, però: non puoi confrontare una stringa di byte e una stringa unicode, quindi in Python 3 dovresti fare la cosa normale e solo ordinare gli elenchi di un tipo di stringa.

>>> lst = ['Aden', u'abe1'] 
>>> sorted(lst) 
['Aden', u'abe1'] 
>>> sorted(lst, key=lambda s: s.lower()) 
[u'abe1', 'Aden'] 
>>> 
+1

+1 Risposta corretta ma Python 3 funziona poiché non ha tipi diversi in quanto utilizza unicode per impostazione predefinita. – jamylak

+0

@jamylak: Se la risposta dovesse essere modificata, per non parlare più di Python 2 o 3? – ArtOfWarfare

+1

Ho fatto un chiarimento. Spero sia più chiaro ora. –

36
>>> x = ['Aden', 'abel'] 
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode 
['abel', 'Aden'] 

In Python 3 str è Unicode, ma in Python 2 è possibile utilizzare questo approccio più generale che funziona sia per str e unicode:

>>> sorted(x, key=lambda s: s.lower()) 
['abel', 'Aden'] 
+0

Grazie. So che avrei dovuto dirlo prima, ma ho sentito che c'è un problema con l'uso di questo metodo su una stringa unicode (Py2). Ne sai qualcosa? –

+0

Sono tutti unicode. Grazie! Un'altra domanda, come farlo su una lista come questa: '[['Aden'], ['abel']]' –

+0

Ogni lista ha solo un oggetto? Se è così basta modificarlo un po 'per: 'ordinato (x, chiave = lambda i: i [0] .lower())' – jamylak

7

Si può anche provare questo:

>>> x = ['Aden', 'abel'] 
>>> x.sort(key=lambda y: y.lower()) 
>>> x 
['abel', 'Aden'] 
-2

Prova questa

def cSort(inlist, minisort=True): 
    sortlist = [] 
    newlist = [] 
    sortdict = {} 
    for entry in inlist: 
     try: 
      lentry = entry.lower() 
     except AttributeError: 
      sortlist.append(lentry) 
     else: 
      try: 
       sortdict[lentry].append(entry) 
      except KeyError: 
       sortdict[lentry] = [entry] 
       sortlist.append(lentry) 

    sortlist.sort() 
    for entry in sortlist: 
     try: 
      thislist = sortdict[entry] 
      if minisort: thislist.sort() 
      newlist = newlist + thislist 
     except KeyError: 
      newlist.append(entry) 
    return newlist 

lst = ['Aden', 'abel'] 
print cSort(lst) 

uscita

['abel', 'Aden']

+8

Questa soluzione è eccessiva e illeggibile quando è sufficiente un solo liner. Questo potrebbe essere più accettabile in una lingua diversa da Python. – IceArdor

1

ho fatto in questo modo per Python 3.3:

def sortCaseIns(lst): 
    lst2 = [[x for x in range(0, 2)] for y in range(0, len(lst))] 
    for i in range(0, len(lst)): 
     lst2[i][0] = lst[i].lower() 
     lst2[i][1] = lst[i] 
    lst2.sort() 
    for i in range(0, len(lst)): 
     lst[i] = lst2[i][1] 

Poi basta può chiamare questa funzione:

sortCaseIns(yourListToSort) 
2

In python3 è possibile utilizzare

list1.sort(key=lambda x: x.lower()) #Case In-sensitive    
list1.sort() #Case Sensitive