2008-08-30 58 views
299

Cách tốt nhất để tạo danh sách được sắp xếp theo thứ tự bảng chữ cái trong Python là gì?Cách sắp xếp danh sách các chuỗi?

+1

Sử dụng 'locale' và chuỗi các phương pháp đối chiếu nó để sắp xếp một cách tự nhiên theo miền địa phương hiện nay. – u0b34a0f6ae

Trả lời

384

trả lời cơ bản:

mylist = ["b", "C", "A"] 
mylist.sort() 

này sửa đổi danh sách ban đầu của bạn (ví dụ: các loại tại chỗ). Để có được một bản sao được sắp xếp danh sách, không làm thay đổi bản gốc, sử dụng sorted() chức năng:

for x in sorted(mylist): 
    print x 

Tuy nhiên, các ví dụ trên là một chút ngây thơ, bởi vì họ không dùng locale vào tài khoản, và thực hiện một trường hợp phân loại nhạy cảm. Bạn có thể tận dụng thông số tùy chọn key để chỉ định thứ tự sắp xếp tùy chỉnh (cách thay thế, sử dụng cmp, là một giải pháp không được chấp nhận vì nó phải được đánh giá nhiều lần - key chỉ được tính một lần cho mỗi phần tử).

Vì vậy, để sắp xếp theo miền địa phương hiện nay, lấy quy tắc ngôn ngữ cụ thể vào tài khoản (cmp_to_key là một hàm helper từ functools):

sorted(mylist, key=cmp_to_key(locale.strcoll)) 

Và cuối cùng, nếu bạn cần, bạn có thể chỉ định một custom locale để phân loại:

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale 
assert sorted((u'Ab', u'ad', u'aa'), 
    key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad'] 

lưu ý cuối: bạn sẽ thấy ví dụ về trường hợp-insensitive phân loại mà sử dụng phương pháp lower() - những không đúng, bởi vì họ chỉ làm việc cho các tập hợp con ASCII của ký tự. Hai là sai đối với bất kỳ dữ liệu không phải tiếng Anh:

# this is incorrect! 
mylist.sort(key=lambda x: x.lower()) 
# alternative notation, a bit faster, but still wrong 
mylist.sort(key=str.lower) 
+33

'mylist.sort (key = str.lower)' là nhanh hơn. – jfs

+0

Điểm tốt. Tôi sẽ để lại ví dụ hiện tại của tôi, vì nó có thể dễ dàng hơn cho một người mới bắt đầu để xem những gì đang xảy ra, nhưng tôi sẽ ghi nhớ điều đó trong tương lai. –

+1

Nếu bất cứ ai tò mò, hiệu suất của list.sort() có thể được tìm thấy [ở đây] (http://stackoverflow.com/questions/1517347/about-pythons-built-in-sort-method) –

32
list.sort() 

Nó thực sự là đơn giản :)

+2

Không hoạt động trên Python 3.6 với số. Sử dụng 'sắp xếp (danh sách)' thay thế. – Dmitry

10

Nhưng làm thế nào để xử lý này ngôn ngữ cụ thể sắp xếp quy tắc? Liệu nó có tính đến vị trí không?

Không, list.sort() là chức năng phân loại chung. Nếu bạn muốn sắp xếp theo các quy tắc Unicode, bạn sẽ phải xác định một chức năng khóa sắp xếp tùy chỉnh. Bạn có thể thử sử dụng mô-đun pyuca, nhưng tôi không biết nó hoàn chỉnh như thế nào.

41

Nó cũng đáng chú ý là sorted() chức năng:

for x in sorted(list): 
    print x 

này trả về một mới, phiên bản được sắp xếp một danh sách mà không thay đổi danh sách ban đầu.

18

Cách thích hợp để sắp xếp chuỗi là:

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale 
assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad'] 

# Without using locale.strcoll you get: 
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad'] 

Ví dụ trước đây của mylist.sort(key=lambda x: x.lower()) sẽ làm việc tốt cho bối cảnh ASCII-only.

1

Giả sử s = "ZWzaAd"

Để sắp xếp chuỗi trên, giải pháp đơn giản sẽ dưới một.

print ''.join(sorted(s)) 
4

Vui lòng sử dụng sắp xếp) chức năng (trong Python3

items = ["love", "like", "play", "cool", "my"] 
sorted(items2) 
Các vấn đề liên quan