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?

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

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

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


4

Cara termudah untuk melakukannya adalah:

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


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

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!


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.