Adrián
Dada una lista de palabras, devolver una lista con las mismas palabras en orden de longitud (de mayor a menor), el segundo criterio de clasificación debe ser alfabético. Pista: necesitas pensar en dos funciones.
Esto es lo que tengo hasta ahora:
def bylength(word1,word2):
return len(word2)-len(word1)
def sortlist(a):
a.sort(cmp=bylength)
return a
ordena por longitud, pero no sé cómo aplicar el segundo criterio a este orden, que es por orden alfabético descendente.
jochen ritzel
Puedes hacerlo en dos pasos como este:
the_list.sort() # sorts normally by alphabetical order
the_list.sort(key=len, reverse=True) # sorts by descending length
La ordenación de Python es estable, lo que significa que ordenar la lista por longitud deja los elementos en orden alfabético cuando la longitud es igual.
También puedes hacerlo así:
the_list.sort(key=lambda item: (-len(item), item))
Generalmente nunca necesitas cmp
incluso se eliminó en Python3. key
es mucho más fácil de usar.
-
¡la solución lambda es asombrosa!
– dmeu
18/03/2016 a las 16:31
-
¡La segunda solución fue un poco de arte y no conocía las obras clave de esa manera!
– Hombre enmascarado
30 de abril de 2019 a las 15:45
-
@jochen Cuando hago esto obtengo un
'str' object has no attribute 'sort'
error porque no estoy usando una lista. Es una cadena de abrir el csv. ¿Alguna sugerencia?–Edison
13 mayo 2020 a las 15:46
-
Pregunta anterior de @Edison, pero podría dividirse en comas/separadores de línea para crear una lista y luego aplicar esta solución
– samm82
17 de diciembre de 2020 a las 23:54
-
solo me pregunto por qué está devolviendo una tupla en la función lambda cuando solo podría devolver
-len(item)
–Anthony Awuley
6 de marzo de 2022 a las 15:58
Arindam Roychowdhury
n = ['aaa', 'bbb', 'ccc', 'dddd', 'dddl', 'yyyyy']
for i in reversed(sorted(n, key=len)):
print i
aaaa dddl dddd ccc bbb aaa
for i in sorted(n, key=len, reverse=True):
print i
aaaa dddd dddl aaa bbb ccc
-
Esto solo funciona si la matriz ya está ordenada. Solo
sorted( sorted( iterable ), key=len )
siempre da la respuesta correcta.– usuario
16 de junio de 2018 a las 18:46
-
@user Acabo de probar con una matriz sin ordenar. Obteniendo el mismo resultado (correcto). ¿Puede proporcionar su matriz de entrada?
–Arindam Roychowdhury
18 de junio de 2018 a las 7:36
-
sorted( ['bb', 'b', 'aa', 'a'], key=len, reverse=True)
produce['bb', 'aa', 'b', 'a']
pero debe ser['aa', 'bb', 'a', 'b']
como obtener desorted( sorted( ['bb', 'b', 'aa', 'a'] ), key=len, reverse=True)
– usuario
18 de junio de 2018 a las 13:48
-
Esto es simplemente clasificar por longitud de cadena en orden descendente.
– frederick99
21 de septiembre de 2021 a las 23:09
-Sort your list by alpha order, then by length.
See the following exmple:
>>> coursesList = ["chemistry","physics","mathematics","art"]
>>> sorted(coursesList,key=len)
['art', 'physics', 'chemistry', 'mathematics']
>>> coursesList.append("mopsosa")
>>> sorted(coursesList,key=len)
['art', 'physics', 'mopsosa', 'chemistry', 'mathematics']
>>> coursesList.sort()
>>> sorted(coursesList,key=len)
['art', 'mopsosa', 'physics', 'chemistry', 'mathematics']
Primero ordene por Alfabeto y luego ordene por Longitud.
Aquí hay un ejemplo de trabajo
mylist.sort()
mylist = sorted(mylist, key=len, reverse=False)
# Print the items on individual line
for i in mylist:
print(i)
Aunque Jochen Ritzel dijo que no necesita cmp, ¡este es en realidad un gran caso de uso para él! ¡Usando cmp puede ordenar por longitud y luego alfabéticamente al mismo tiempo en la mitad del tiempo que tomaría ordenar dos veces!
def cmp_func(a, b):
# sort by length and then alphabetically in lowercase
if len(a) == len(b):
return cmp(a, b)
return cmp(len(a), len(b))
sorted_the_way_you_want = sorted(the_list, cmp=cmp_func)
Ejemplo:
>>> the_list = ['B', 'BB', 'AA', 'A', 'Z', 'C', 'D']
>>> sorted(the_list, cmp=cmp_func)
['A', 'B', 'C', 'D', 'Z', 'AA', 'BB']
Tenga en cuenta que si su lista es una combinación de mayúsculas y minúsculas, reemplace cmp(a, b)
con cmp(a.lower(), b.lower())
como python ordena ‘a’ > ‘Z’.
En python3 necesitarías estar ordenando objetos con __lt__
funciones de comparación de estilos definidas o functools.cmp_to_key()
que hace eso por ti.
-
no muy interesante como
cmp
ya no existe en python 3 (lo dijiste tú mismo)– Jean-François Fabre
♦4 de diciembre de 2018 a las 21:04
braun89
def cmp_func(a, b):
# sort by length and then alphabetically in lowercase
if len(a) == len(b):
return cmp(a, b)
return cmp(len(a), len(b))
sorted_the_way_you_want = sorted(the_list, cmp=cmp_func)
-
no muy interesante como
cmp
ya no existe en python 3 (lo dijiste tú mismo)– Jean-François Fabre
♦4 de diciembre de 2018 a las 21:04