Sortieren der Python-Liste nach der Länge der Zeichenfolge

110

Ich möchte eine Liste von Zeichenfolgen basierend auf der Zeichenfolgenlänge sortieren. Ich habe versucht, sort wie folgt zu verwenden, aber es scheint mir kein korrektes Ergebnis zu liefern.

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

Was könnte falsch sein?

prosseek
quelle

Antworten:

201

Wenn Sie ein lambdaan übergeben sort, müssen Sie eine Ganzzahl und keinen Booleschen Wert zurückgeben. Ihr Code sollte also stattdessen wie folgt lauten:

xs.sort(lambda x,y: cmp(len(x), len(y)))

Beachten Sie, dass cmp eine integrierte Funktion ist, cmp(x, y)die -1 zurückgibt, wenn sie xkleiner als ist y, 0, wenn sie xgleich ist y, und 1, wenn sie xgrößer als ist y.

Natürlich können Sie stattdessen den keyParameter verwenden:

xs.sort(key=lambda s: len(s))

Dies weist die sortMethode an, basierend auf dem, was die Schlüsselfunktion zurückgibt, zu bestellen.

BEARBEITEN: Vielen Dank an balpha und Ruslan unten für den Hinweis, dass Sie lendirekt als Schlüsselparameter an die Funktion übergeben können, wodurch die Notwendigkeit eines lambda:

xs.sort(key=len)

Und wie Ruslan unten weist darauf hin, können Sie auch die eingebauten in sortierten Funktion anstelle der list.sortMethode, die eher eine neue Liste erstellt als die Sortierung der vorhandenen in-place:

print(sorted(xs, key=len))
Eli Courtwright
quelle
32
Keine Notwendigkeit für die lambda; benutze einfachkey = len
balpha
14
Dies wird in aufsteigender Reihenfolge (kleinere Länge der Wörter oben) sortiert, um in absteigender Reihenfolge (kleinere Länge der Wörter unten) zu sortieren. Fügen Sie einen Parameter reverse = True
Ajay Gupta
Der xs.sort()Auslöser "TypeError: sort () akzeptiert keine Positionsargumente". Stattdessen sollte es seinxs.sort(key=lambda x: len(x))
Hi-Angel
84

Das gleiche wie in Elis Antwort - nur mit einem kürzeren Formular, da Sie lambdahier einen Teil überspringen können .

Neue Liste erstellen:

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

In-Place-Sortierung:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
Ruslan Spivak
quelle
5
Wie kann ich die Sortierung nach Länge umkehren?
user2922935
1
@ user2922935: Sie können xs [:: - 1] ausführen, um die bereits sortierte Liste umzukehren. Lesen
Sie
7
xs.sort(key=len, reverse=True)
Raz
5

Ich möchte hinzufügen, wie die Python-Tastenfunktion beim Sortieren funktioniert:

Dekorieren-Sortieren-Undekorieren-Designmuster:

Pythons Unterstützung für eine Schlüsselfunktion beim Sortieren wird mithilfe des so genannten Designmusters "Dekorieren-Sortieren-Nichtdekorieren" implementiert.

Es geht in 3 Schritten vor:

  1. Jedes Element der Liste wird vorübergehend durch eine "dekorierte" Version ersetzt, die das Ergebnis der auf das Element angewendeten Schlüsselfunktion enthält.

  2. Die Liste wird nach der natürlichen Reihenfolge der Schlüssel sortiert.

  3. Die dekorierten Elemente werden durch die ursprünglichen Elemente ersetzt.

Schlüsselparameter zum Angeben einer Funktion, die für jedes Listenelement aufgerufen werden soll, bevor Vergleiche durchgeführt werden. docs

James Sapam
quelle
4

Der einfachste Weg, dies zu tun, ist:

list.sort (Schlüssel = Lambda x: len (x))

Chirag Patel
quelle
1

Schreiben Sie eine Funktion Lensort, um eine Liste von Zeichenfolgen nach Länge zu sortieren.

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
quelle
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

Das funktioniert bei mir!

Saurabh Ariyan
quelle
0

Ich kann es mit den folgenden zwei Methoden tun, mit Funktion

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

In einem Liner mit Lambda, wie unten, bereits oben beantwortet.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Aashutosh
quelle