Mengurutkan daftar Python berdasarkan panjang string

110

Saya ingin mengurutkan daftar string berdasarkan panjang string. Saya mencoba menggunakan sort sebagai berikut, tetapi sepertinya tidak memberikan hasil yang benar.

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

Apa mungkin salah?

prosseek
sumber

Jawaban:

201

Saat Anda meneruskan lambdake sort, Anda harus mengembalikan integer, bukan boolean. Jadi kode Anda seharusnya terbaca sebagai berikut:

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

Perhatikan bahwa cmp adalah fungsi bawaan yang cmp(x, y)mengembalikan -1 jika xkurang dari y, 0 jika xsama dengan y, dan 1 jika xlebih besar dari y.

Tentu saja, Anda dapat menggunakan keyparameter:

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

Ini memberi tahu sortmetode untuk memesan berdasarkan apa pun yang dikembalikan oleh fungsi kunci.

EDIT: Terima kasih kepada balpha dan Ruslan di bawah ini karena telah menunjukkan bahwa Anda bisa lenlangsung meneruskan sebagai parameter kunci ke fungsi, sehingga menghilangkan kebutuhan akan lambda:

xs.sort(key=len)

Dan seperti yang ditunjukkan Ruslan di bawah ini, Anda juga dapat menggunakan fungsi terurut bawaan daripada list.sortmetode, yang membuat daftar baru daripada menyortir yang sudah ada di tempat:

print(sorted(xs, key=len))
Eli Courtwright
sumber
32
Tidak perlu lambda; cukup gunakankey = len
balpha
15
Ini akan mengurutkan dalam Ascending Order (Lebih kecil kata-kata di atas), untuk mengurutkan dalam Descending Order (Lebih kecil kata-kata di bawah) tambahkan parameter reverse = True
Ajay Gupta
The xs.sort()melempar "TypeError: sort () tidak membutuhkan argumen posisional". Sebaliknya seharusnyaxs.sort(key=lambda x: len(x))
Hi-Angel
84

Sama seperti jawaban Eli - hanya menggunakan bentuk yang lebih pendek, karena Anda dapat melewati satu lambdabagian di sini.

Membuat daftar baru:

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

Penyortiran di tempat:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
Ruslan Spivak
sumber
5
Bagaimana cara membalik urutan panjang?
pengguna2922935
1
@ user2922935: Anda dapat melakukan xs [:: - 1] untuk membalikkan daftar yang sudah diurutkan. Lihat artikel Dan Bader di sini: dbader.org/blog/python-reverse-list
Thyag
7
xs.sort(key=len, reverse=True)
Raz
5

Saya ingin menambahkan cara kerja fungsi kunci pythonic saat menyortir:

Pola Desain Hiasi-Sortir-Undecorate:

Dukungan Python untuk fungsi kunci saat penyortiran diimplementasikan menggunakan apa yang dikenal sebagai pola desain decorate-sort-undecorate.

Ini berlangsung dalam 3 langkah:

  1. Setiap elemen dari daftar untuk sementara diganti dengan versi "dihiasi" yang menyertakan hasil dari fungsi kunci yang diterapkan ke elemen tersebut.

  2. Daftar ini diurutkan berdasarkan urutan alami tombol.

  3. Elemen dekorasi diganti dengan elemen asli.

Parameter kunci untuk menentukan fungsi yang akan dipanggil pada setiap elemen daftar sebelum membuat perbandingan. docs

James Sapam
sumber
4

Cara termudah untuk melakukannya adalah:

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

Chirag Patel
sumber
1

Tulis function lensort untuk mengurutkan daftar string berdasarkan panjangnya.

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

Ini berhasil untuk saya!

Saurabh Ariyan
sumber
0

Saya dapat melakukannya menggunakan dua metode di bawah ini, menggunakan fungsi

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

Dalam satu Liner menggunakan Lambda, seperti di bawah ini, sudah dijawab di atas.

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