2012-04-22 11 views
79

que tienen una lista de cadenas como esto:ordenación de lista insensible a mayúsculas y minúsculas, sin minúsculas?

['Aden', 'abel'] 

Quiero ordenar los elementos, entre mayúsculas y minúsculas. Así que quiere conseguir:

['abel', 'Aden'] 

pero me da lo contrario con sorted() o list.sort(), porque aparece antes de mayúsculas en minúsculas.

¿Cómo puedo ignorar el caso? He visto soluciones que implican la minoría de todos los elementos de la lista, pero no quiero cambiar el caso de los elementos de la lista.

Respuesta

115

las siguientes obras en Python 2:

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

Funciona para cadenas tanto normales como unicode, ya que ambas tienen un método lower.

En Python 2 funciona para una mezcla de cadenas normales y unicode, ya que los valores de los dos tipos se pueden comparar entre sí. Sin embargo, Python 3 no funciona así: no se puede comparar una cadena de bytes y una cadena unicode, por lo que en Python 3 debes hacer lo que se dice sano y solo ordenar las listas de un tipo de cadena.

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

+1 Respuesta correcta, pero Python 3 funciona, ya que no tiene diferentes tipos, ya que utiliza Unicode de manera predeterminada. – jamylak

+0

@jamylak: ¿Debería editarse la respuesta, para no mencionar Python 2 o 3? – ArtOfWarfare

+1

Hice una aclaración. Espero que esté más claro ahora. –

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

En Python 3 str es Unicode, pero en Python 2 se puede utilizar este enfoque más general que funciona tanto para str y unicode:

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

Gracias. Sé que debería haber mencionado esto antes, pero he oído que hay un problema con el uso de este método en una cadena Unicode (Py2). ¿Sabes algo sobre eso? –

+0

Todos son unicode. ¡Gracias! Una pregunta más, cómo hacerlo en una lista como esta: '[['Aden'], ['abel']]' –

+0

¿Cada lista solo tiene un elemento? Si es así, modifíquelo un poco para: 'ordenado (x, clave = lambda i: i [0] .lower())' – jamylak

7

También puede probar esto:

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

probar este

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) 

salida

['abel', 'Aden']

+8

Esta solución es exagerada e ilegible cuando es suficiente con un trazador de líneas. Esto podría ser más aceptable en un idioma que no sea Python. – IceArdor

1

lo hice de esta manera para 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] 

continuación, sólo puede llamar a esta función:

sortCaseIns(yourListToSort) 
2

En python3 puede utilizar

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