hoe sorteer ik op lengte van string gevolgd door alfabetische volgorde?

Ik ben momenteel nieuw in python en liep vast bij deze vraag, ik kan het juiste antwoord niet vinden.

vraag:Gegeven een lijst met woorden, retourneer een lijst met dezelfde woorden in volgorde van lengte (van langste naar kortste), het tweede sorteercriterium moet alfabetisch zijn. Hint: je moet twee functies bedenken.

Dit is wat ik tot nu toe heb:

def bylength(word1,word2):
    return len(word2)-len(word1)
def sortlist(a):
    a.sort(cmp=bylength)
    return a

het sorteert op lengte, maar ik weet niet hoe ik het tweede criterium moet toepassen op deze sortering, namelijk alfabetisch aflopend.


Antwoord 1, autoriteit 100%

Je kunt het in twee stappen als volgt doen:

the_list.sort() # sorts normally by alphabetical order
the_list.sort(key=len, reverse=True) # sorts by descending length

De sortering van Python is stabiel, wat betekent dat bij het sorteren van de lijst op lengte de elementen in alfabetische volgorde blijven als de lengte gelijk is.

Je kunt het ook als volgt doen:

the_list.sort(key=lambda item: (-len(item), item))

Over het algemeen heb je cmpnooit nodig, het werd zelfs verwijderd in Python3. keyis veel gemakkelijker te gebruiken.


Antwoord 2, autoriteit 3%

n = ['aaa', 'bbb', 'ccc', 'dddd', 'dddl', 'yyyyy']
for i in reversed(sorted(n, key=len)):
    print i

jjjjj dddl dddd ccc bbb aaa

for i in sorted(n, key=len, reverse=True):
     print i

jjjjj dddd dddl aaa bbb ccc


Antwoord 3, autoriteit 2%

-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']

Antwoord 4

Eerst sorteren op alfabet en dan sorteren op lengte.

Hier is een werkend voorbeeld

mylist.sort()
mylist = sorted(mylist, key=len, reverse=False)
# Print the items on individual line
for i in mylist:
    print(i)

Antwoord 5

Hoewel Jochen Ritzel zei dat je cmp niet nodig hebt, is dit eigenlijk een prima gebruiksvoorbeeld! Met cmp kun je sorteren op lengte en vervolgens alfabetisch tegelijk in de helft van de tijd die twee keer sorteren zou kosten!

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)

Voorbeeld:

>>> the_list = ['B', 'BB', 'AA', 'A', 'Z', 'C', 'D']
>>> sorted(the_list, cmp=cmp_func)
['A', 'B', 'C', 'D', 'Z', 'AA', 'BB']

Let op, als uw lijst een combinatie is van hoofdletters en kleine letters, vervang dan cmp(a, b)door cmp(a.lower(), b.lower())als python ‘a’ > ‘Z’.

In python3 moet je objecten sorteren met __lt__stijlvergelijkingsfuncties gedefinieerd of functools.cmp_to_key()die dat voor u doet.

Other episodes