Sắp xếp danh sách Python dựa trên độ dài của chuỗi


110

Tôi muốn sắp xếp danh sách các chuỗi dựa trên độ dài chuỗi. Tôi đã cố gắng sử dụng sắp xếp như sau, nhưng nó có vẻ không cho tôi kết quả chính xác.

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

Điều gì có thể sai?

Câu trả lời:


201

Khi bạn chuyển một lambdađến sort, bạn cần trả về một số nguyên, không phải boolean. Vì vậy, mã của bạn thay vào đó nên đọc như sau:

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

Lưu ý rằng cmp là một hàm nội trang cmp(x, y)trả về -1 nếu xnhỏ hơn y, 0 nếu xbằng yvà 1 nếu xlớn hơn y.

Tất nhiên, thay vào đó bạn có thể sử dụng keytham số:

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

Điều này cho biết sortphương thức sắp xếp thứ tự dựa trên bất kỳ thứ gì mà hàm khóa trả về.

CHỈNH SỬA: Cảm ơn balpha và Ruslan bên dưới đã chỉ ra rằng bạn chỉ có thể truyền lentrực tiếp làm tham số chính cho hàm, do đó loại bỏ sự cần thiết phải có lambda:

xs.sort(key=len)

Và như Ruslan chỉ ra bên dưới, bạn cũng có thể sử dụng hàm sắp xếp được tích hợp sẵn thay vì list.sortphương pháp tạo danh sách mới thay vì sắp xếp danh sách hiện có tại chỗ:

print(sorted(xs, key=len))

32
Không cần lambda; chỉ cần sử dụngkey = len
balpha

15
Điều này sẽ loại tăng dần theo thứ tự (chiều dài nhỏ hơn các từ ở đầu trang), để sắp xếp Sắp theo (Thời lượng nhỏ các từ ở phía dưới) thêm một tham số ngược = True
Ajay Gupta

Lệnh xs.sort()ném "TypeError: sort () không có đối số vị trí". Thay vào đó, nó nên làxs.sort(key=lambda x: len(x))
Hi-Angel

84

Giống như trong câu trả lời của Eli - chỉ sử dụng một dạng ngắn hơn, vì bạn có thể bỏ qua một lambdaphần ở đây.

Tạo danh sách mới:

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

Sắp xếp tại chỗ:

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

5
Làm cách nào để sắp xếp ngược về độ dài?
user2922935

1
@ user2922935: Bạn có thể thực hiện xs [:: - 1] để đảo ngược danh sách đã được sắp xếp. Xem bài viết của Dan Bader tại đây: dbader.org/blog/python-reverse-list
Thyag

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

5

Tôi muốn thêm cách hoạt động của chức năng phím pythonic khi sắp xếp:

Trang trí-Sắp xếp-Không trang trí Mẫu thiết kế:

Hỗ trợ của Python cho một chức năng chính khi sắp xếp được thực hiện bằng cách sử dụng cái được gọi là mẫu thiết kế trang trí-sắp xếp-không trang trí.

Nó tiến hành theo 3 bước:

  1. Mỗi phần tử của danh sách được thay thế tạm thời bằng một phiên bản “được trang trí” bao gồm kết quả của chức năng chính được áp dụng cho phần tử.

  2. Danh sách được sắp xếp dựa trên thứ tự tự nhiên của các khóa.

  3. Các yếu tố trang trí được thay thế bằng các yếu tố ban đầu.

Tham số chính để chỉ định một hàm được gọi trên mỗi phần tử danh sách trước khi thực hiện so sánh. tài liệu


4

Cách dễ nhất để làm điều này là:

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


1

Viết một hàm lensort để sắp xếp danh sách các chuỗi dựa trên độ dài.

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

Điều này làm việc cho tôi!


0

Tôi có thể làm điều đó bằng hai phương pháp dưới đây, sử dụng hàm

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

Trong một Liner sử dụng Lambda, như bên dưới, một câu trả lời đã được trả lời ở trên.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.