He estado haciendo un curso en Python, y llegué al ejercicio donde tengo este código

words = ['pear', 'cabbage', 'apple', 'bananas']
words.sort(key=lambda s: s[-1])  # Alternatively, key=operator.itemgetter(-1)
words  # => ['cabbage', 'apple', 'pear', 'bananas'] ... Why 'cabbage' > 'apple'?
max(words, key=len)  # 'cabbage' ... Why not 'bananas'?

¿Alguien puede explicar por qué la ordenación ordena la lista de esa manera?

¿Y por qué encontrar un artículo con longitud máxima devuelve un artículo incorrecto? No es el resultado esperado en absoluto.

0
Bobby 3 mar. 2018 a las 13:10

3 respuestas

La mejor respuesta

Utiliza el último carácter como criterio de clasificación. La clasificación es estable. Por lo tanto, para esta lista:

words = ['pear', 'cabbage', 'apple', 'bananas']

cabbage y apple se comparan igual para la última letra y permanecen en el orden en que están en la lista original.

Por la misma razón, max te da cabbage. Ambos tienen la misma longitud:

>>> len('cabbage') == len('bananas')
True

Y cabbage está antes de bananas en la lista original.

Las documentos explican esto bien:

El método sort() está garantizado para ser estable. Una ordenación es estable si garantiza no cambiar el orden relativo de los elementos que se comparan entre sí; esto es útil para ordenar en varios pases (por ejemplo, ordenar por departamento, luego por grado salarial).

2
Mike Müller 3 mar. 2018 a las 10:29

Su código se está ordenando de acuerdo con el último índice.

words.sort(key=lambda s: s[0]) 

"plátanos" y "repollo" tienen la misma longitud. Busca cuál es el primero en la lista y luego imprime esta primera aparición

2
Artier 3 mar. 2018 a las 10:23

Su código words.sort(key=lambda s:s[-1]) ordena las palabras por el último carácter de cada una de las palabras y, si hay varias posibilidades, mantiene el orden en la lista original.

Si necesita un orden alfabético regular, debe usar words.sort() y el resultado sería

>>> words.sort()
>>> words
['apple', 'bananas', 'cabbage', 'pear']

Si ordena las palabras por key=len, la lista contiene [ ... , 'cabbage', 'bananas']. max() encuentra el primer valor de la lista de valores posibles y, por lo tanto, su resultado es cabbage como aparece antes de bananas

2
Sudheesh Singanamalla 3 mar. 2018 a las 10:22