Python listesini dizenin uzunluğuna göre sıralama


110

Dize uzunluğuna göre dizelerin listesini sıralamak istiyorum. Sıralamayı aşağıdaki gibi kullanmaya çalıştım, ancak bana doğru sonuç vermiyor gibi görünüyor.

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

Sorun ne olabilir?

Yanıtlar:


201

Bir geçtiğinizde lambdaiçin sort, bir tamsayı değil, bir boolean dönmek gerekir. Dolayısıyla kodunuz bunun yerine aşağıdaki gibi olmalıdır:

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

Not bu cmp yerleşik bir fonksiyonu olacağı şekilde cmp(x, y)döner takdirde -1 xbundan az olup olmadığını y0 ise, xisimli için eşit yise ve 1 xdaha büyüktür y.

Tabii ki, bunun yerine keyparametreyi kullanabilirsiniz :

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

Bu, sortyönteme, anahtar işlevin döndürdüğü şeye göre sıralama yapmasını söyler .

DÜZENLEME: Aşağıdaki balpha ve Ruslan sayesinde, lendoğrudan işleve anahtar parametre olarak doğrudan geçebileceğinizi , böylece a ihtiyacını ortadan kaldırabileceğinizi belirttikleri için lambda:

xs.sort(key=len)

Ve Ruslan'ın aşağıda işaret ettiği gibi, mevcut olanı yerinde sıralamak yerine yeni bir liste oluşturan yöntem yerine yerleşik sıralanmış işlevi de kullanabilirsiniz list.sort:

print(sorted(xs, key=len))

32
Gerek yok lambda; sadece kullankey = len
balpha

15
Bu tür Artan Sipariş (üstündeki kelimelerin küçük uzunluk), büyükten küçüğe (altta kelimelerin küçük Süresi) sıralamak bir parametre eklemek olacaktır = ters Doğru
Ajay Gupta

xs.sort()": () Hiçbir pozisyonel argüman alır tür TypeError" atar. Bunun yerinexs.sort(key=lambda x: len(x))
Merhaba-Melek

84

Eli'nin cevabındaki ile aynı - sadece daha kısa bir form kullanarak, çünkü bir lambda burada bölümü .

Yeni liste oluşturma:

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

Yerinde sıralama:

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

5
Uzunlukta sıralamayı nasıl tersine çeviririm?
user2922935

1
@ user2922935: Önceden sıralanmış listeyi tersine çevirmek için xs [:: - 1] yapabilirsiniz. Dan Bader'in makalesine buradan göz
atın

7
xs.sort(key=len, reverse=True)
Raz

5

Ayırma sırasında pitonik anahtar işlevinin nasıl çalıştığını eklemek istiyorum:

Süsle-Sırala-Süslenmemiş Tasarım Deseni:

Sıralama, süsle-sırala-süssüz tasarım modeli olarak bilinen yöntem kullanılarak uygulandığında Python'un bir anahtar işlevi desteklemesi.

3 adımda ilerler:

  1. Listenin her bir öğesi, öğeye uygulanan anahtar işlevinin sonucunu içeren "süslenmiş" bir sürümle geçici olarak değiştirilir.

  2. Liste, tuşların doğal sırasına göre sıralanır.

  3. Süslenmiş unsurlar orijinal unsurlarla değiştirilir.

Karşılaştırmalar yapmadan önce her liste öğesinde çağrılacak bir işlevi belirtmek için anahtar parametresi. docs


4

Bunu yapmanın en kolay yolu şudur:

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


1

Bir dizi listesini uzunluğa göre sıralamak için bir işlev lensort yazın.

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

Bu benim için çalışıyor!


0

Fonksiyonu kullanarak aşağıdaki iki yöntemi kullanarak yapabilirim

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

Aşağıdaki gibi Lambda kullanan bir Liner'da, yukarıda zaten cevaplanmış.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.