Sortowanie listy Pythona na podstawie długości łańcucha
110
Chcę posortować listę ciągów na podstawie ich długości. Próbowałem użyć sortowania w następujący sposób, ale wydaje mi się, że nie daje to poprawnego wyniku.
Kiedy przekazujesz lambdado sort, musisz zwrócić liczbę całkowitą, a nie wartość logiczną. Więc zamiast tego twój kod powinien wyglądać następująco:
xs.sort(lambda x,y: cmp(len(x), len(y)))
Zauważ, że cmp jest funkcją wbudowaną, która cmp(x, y)zwraca -1, jeśli xjest mniejsze niż y, 0, jeśli xjest równe y, i 1, jeśli xjest większe niż y.
Oczywiście możesz zamiast tego użyć keyparametru:
xs.sort(key=lambda s: len(s))
To mówi sortmetodzie, aby zamówić na podstawie tego, co zwraca funkcja klucza.
EDYCJA: Podziękowania dla balpha i Ruslana poniżej za wskazanie, że możesz po prostu przekazać lenbezpośrednio jako kluczowy parametr do funkcji, eliminując w ten sposób potrzebę lambda:
xs.sort(key=len)
I jak Ruslan wskazuje poniżej, możesz również użyć wbudowanej funkcji sortowania zamiast list.sortmetody, która tworzy nową listę zamiast sortowania istniejącej na miejscu:
To posortuje w porządku rosnącym (mniejsza długość słów na górze), aby posortować w porządku malejącym (mniejsza długość słów na dole) dodaj parametr reverse = True
Ajay Gupta
xs.sort()Rzuca „TypeError: sort () nie przyjmuje żadnych argumentów pozycyjnych”. Zamiast tego powinno byćxs.sort(key=lambda x: len(x))
Hi-Angel
84
To samo, co w odpowiedzi Eli - wystarczy użyć krótszej formy, ponieważ możesz pominąć lambdaczęść tutaj.
Napisz funkcję lensort, aby posortować listę ciągów według długości.
def lensort(a):
n = len(a)for i in range(n):for j in range(i+1,n):if len(a[i])> len(a[j]):
temp = a[i]
a[i]= a[j]
a[j]= temp
return a
print lensort(["hello","bye","good"])
def lensort(list_1):
list_2=[];list_3=[]for i in list_1:
list_2.append([i,len(i)])
list_2.sort(key =lambda x : x[1])for i in list_2:
list_3.append(i[0])return list_3
Mogę to zrobić za pomocą poniższych dwóch metod, używając funkcji
def lensort(x):
list1 =[]for i in x:
list1.append([len(i),i])return sorted(list1)
lista =['a','bb','ccc','dddd']
a=lensort(lista)print([l[1]for l in a])
W jednym Linerze używającym Lambda, jak poniżej, odpowiedź już powyżej.
lista =['a','bb','ccc','dddd']
lista.sort(key =lambda x:len(x))print(lista)
lambda
; po prostu użyjkey = len
xs.sort()
Rzuca „TypeError: sort () nie przyjmuje żadnych argumentów pozycyjnych”. Zamiast tego powinno byćxs.sort(key=lambda x: len(x))
To samo, co w odpowiedzi Eli - wystarczy użyć krótszej formy, ponieważ możesz pominąć
lambda
część tutaj.Tworzenie nowej listy:
Sortowanie na miejscu:
źródło
xs.sort(key=len, reverse=True)
Chciałbym dodać, jak działa funkcja klucza pythonowego podczas sortowania:
Udekoruj-Sortuj-Oddekoruj Wzorzec projektowy:
Obsługa w Pythonie funkcji kluczowej podczas sortowania jest zaimplementowana przy użyciu tak zwanego wzorca projektowego dekoruj-sortuj-dekoruj.
Postępuje w 3 krokach:
Każdy element listy jest tymczasowo zastępowany wersją „dekorowaną”, która zawiera wynik funkcji klucza zastosowanej do elementu.
Lista jest sortowana na podstawie naturalnej kolejności kluczy.
Zdobione elementy zostały zastąpione oryginalnymi elementami.
Parametr kluczowy do określenia funkcji, która ma zostać wywołana na każdym elemencie listy przed wykonaniem porównań. dokumenty
źródło
Najłatwiej to zrobić:
źródło
Napisz funkcję lensort, aby posortować listę ciągów według długości.
źródło
To działa dla mnie!
źródło
Mogę to zrobić za pomocą poniższych dwóch metod, używając funkcji
W jednym Linerze używającym Lambda, jak poniżej, odpowiedź już powyżej.
źródło