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 cmp
nooit nodig, het werd zelfs verwijderd in Python3. key
is 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.