¿Cómo ordenar una lista por longitud de cadena seguida por orden alfabético inverso? [duplicate]

4 minutos de lectura

Avatar de usuario de Adrian
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.

Avatar de usuario de Jochen Ritzel
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 cmpincluso 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

Avatar de usuario de Arindam Roychowdhury
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 de sorted( 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

avatar de usuario de tbraun89
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

¿Ha sido útil esta solución?