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.

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

Co może być nie tak?

prosseek
źródło

Odpowiedzi:

201

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:

print(sorted(xs, key=len))
Eli Courtwright
źródło
32
Nie ma potrzeby lambda; po prostu użyjkey = len
balpha
15
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.

Tworzenie nowej listy:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

Sortowanie na miejscu:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
Ruslan Spivak
źródło
5
Jak odwrócić sortowanie według długości?
user2922935
1
@ user2922935: Możesz zrobić xs [:: - 1], aby odwrócić już posortowaną listę. Przeczytaj artykuł Dana Badera tutaj: dbader.org/blog/python-reverse-list
Thyag
7
xs.sort(key=len, reverse=True)
Raz
5

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:

  1. Każdy element listy jest tymczasowo zastępowany wersją „dekorowaną”, która zawiera wynik funkcji klucza zastosowanej do elementu.

  2. Lista jest sortowana na podstawie naturalnej kolejności kluczy.

  3. 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

James Sapam
źródło
4

Najłatwiej to zrobić:

list.sort (klucz = lambda x: len (x))

Chirag Patel
źródło
1

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"])
Febin Stephen
źródło
0
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

To działa dla mnie!

Saurabh Ariyan
źródło
0

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)
Aashutosh
źródło