python - una - Ordenar la lista de cadenas que ignoran mayúsculas/minúsculas
string en python (3)
El método sort()
y la función sorted()
toman un argumento clave:
var.sort(key=lambda v: v.upper())
La función nombrada en key
se llama para cada valor y el valor de retorno se usa al ordenar, sin afectar los valores reales:
>>> var=[''ant'',''bat'',''cat'',''Bat'',''Lion'',''Goat'',''Cat'',''Ant'']
>>> sorted(var, key=lambda v: v.upper())
[''ant'', ''Ant'', ''bat'', ''Bat'', ''cat'', ''Cat'', ''Goat'', ''Lion'']
Para ordenar Ant
antes de Ant
, deberías incluir un poco más de información en la clave, de modo que de otra manera los valores iguales se ordenen en un orden dado:
>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
[''Ant'', ''ant'', ''Bat'', ''bat'', ''Cat'', ''cat'', ''Goat'', ''Lion'']
La clave más compleja genera (''ANT'', False)
para Ant
, y (''ANT'', True)
para ant
; True
se ordena después de False
y, por lo tanto, las palabras en mayúsculas se ordenan antes de su equivalente en minúsculas.
Consulte el CÓMO de clasificación de Python para obtener más información.
Tengo una lista que contiene cadenas que representan nombres de animales. Necesito ordenar la lista. Si utilizo sorted(list)
, primero dará salida a la lista con cadenas en mayúsculas y luego en minúsculas.
Pero necesito la salida de abajo.
Entrada:
var = [''ant'',''bat'',''cat'',''Bat'',''Lion'',''Goat'',''Cat'',''Ant'']
Salida:
[''ant'', ''Ant'', ''bat'', ''Bat'', ''cat'', ''Cat'', ''Goat'', ''Lion'']
Nueva respuesta para Python 3, me gustaría agregar dos puntos:
- Utilice
str.casefold
para las comparaciones que no distinguen entre mayúsculas y minúsculas. - Utilice el método directamente en lugar de dentro de un lambda.
Es decir:
var = [''ant'',''bat'',''cat'',''Bat'',''Lion'',''Goat'',''Cat'',''Ant'']
var.sort(key=str.casefold)
(que clasifica en el lugar) y ahora:
>>> var
[''ant'', ''Ant'', ''bat'', ''Bat'', ''cat'', ''Cat'', ''Goat'', ''Lion'']
O, para devolver una nueva lista, use sorted
>>> var = [''ant'',''bat'',''cat'',''Bat'',''Lion'',''Goat'',''Cat'',''Ant'']
>>> sorted(var, key=str.casefold)
[''ant'', ''Ant'', ''bat'', ''Bat'', ''cat'', ''Cat'', ''Goat'', ''Lion'']
¿Por qué es esto diferente de str.lower
o str.upper
? Según la documentación:
El plegado de casos es similar a un minúsculo pero más agresivo porque está destinado a eliminar todas las distinciones de casos en una cadena. Por ejemplo, la letra minúscula alemana
''ß''
es equivalente a"ss"
. Dado que ya está en minúsculas,str.lower()
no haría nada con''ß''
;casefold()
convierte a"ss"
.
Podemos usar la función ''ordenada'' de acuerdo con la documentación de cómo ordenar de Python.
a = sorted(Input, key=str.lower)print("Output1: ",a)
Salida1:
[''ant'', ''Ant'', ''bat'', ''Bat'', ''cat'', ''Cat'', ''Goat'', ''Lion'']