Je suis actuellement nouveau à python et je suis resté coincé à cette question, je n'arrive pas à trouver la bonne réponse.
question: Étant donné une liste de mots, renvoyez une liste avec les mêmes mots par ordre de longueur (du plus long au plus court), le deuxième critère de tri doit être alphabétique. Astuce: vous devez penser à deux fonctions.
Voici ce que j'ai jusqu'à présent:
def bylength(Word1,Word2):
return len(Word2)-len(Word1)
def sortlist(a):
a.sort(cmp=bylength)
return a
il trie par longueur mais je ne sais pas comment appliquer le deuxième critère à ce tri, qui est par ordre alphabétique décroissant.
Vous pouvez le faire en deux étapes comme ceci:
the_list.sort() # sorts normally by alphabetical order
the_list.sort(key=len, reverse=True) # sorts by descending length
Le tri de Python est stable, ce qui signifie que le tri de la liste par longueur laisse les éléments dans l'ordre alphabétique lorsque la longueur est égale.
Vous pouvez également le faire comme ceci:
the_list.sort(key=lambda item: (-len(item), item))
En général, vous n'avez jamais besoin de cmp
, il a même été supprimé en Python3. key
est beaucoup plus facile à utiliser.
n = ['aaa', 'bbb', 'ccc', 'dddd', 'dddl', 'yyyyy']
for i in reversed(sorted(n, key=len)):
print i
aaaaa jjjjjjj ccc bbb aaa
for i in sorted(n, key=len, reverse=True):
print i
aaaaa jjjjjjj aaa bbb ccc
-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']
Bien que Jochen Ritzel ait dit que vous n'avez pas besoin de cmp, c'est en fait un excellent cas d'utilisation pour cela! En utilisant cmp, vous pouvez trier par longueur, puis par ordre alphabétique en même temps en deux fois moins de temps!
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)
Exemple:
>>> the_list = ['B', 'BB', 'AA', 'A', 'Z', 'C', 'D']
>>> sorted(the_list, cmp=cmp_func)
['A', 'B', 'C', 'D', 'Z', 'AA', 'BB']
Remarque, si votre liste est un mélange de majuscules et de minuscules, remplacez cmp(a, b)
par cmp(a.lower(), b.lower())
comme python trie 'a'> ' Z ' .
En python3, vous devez trier les objets avec les fonctions de comparaison de style __lt__
Définies ou functools.cmp_to_key()
ce qui fait cela pour vous.