web-dev-qa-db-fra.com

comment trier par longueur de chaîne suivie par ordre alphabétique?

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.

59
Adrian

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.

122
Jochen Ritzel
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

5
-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']
2
jyfar

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.

0
theannouncer