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?

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

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

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


4

Der einfachste Weg, dies zu tun, ist:

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


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

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!


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.