Làm thế nào để sắp xếp một danh sách các chuỗi?


417

Cách tốt nhất để tạo một danh sách được sắp xếp theo thứ tự abc trong Python là gì?


1
Sử dụng localevà đó là phương pháp đối chiếu chuỗi để sắp xếp tự nhiên theo ngôn ngữ hiện tại.
u0b34a0f6ae

Câu trả lời:


519

Câu trả lời cơ bản:

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

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

for x in sorted(mylist):
    print x

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

Vì vậy, để sắp xếp theo ngôn ngữ hiện tại, hãy tính đến các quy tắc dành riêng cho ngôn ngữ ( cmp_to_keylà một hàm trợ giúp từ funcools):

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 ngôn ngữ tùy chỉnh để sắp xếp:

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 cùng: bạn sẽ thấy các ví dụ về sắp xếp không phân biệt chữ hoa chữ thường sử dụng lower()phương thức này - chúng không chính xác, vì chúng chỉ hoạt động cho tập hợp con ký tự ASCII. Cả hai đều 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)

37
mylist.sort(key=str.lower)nhanh hơn.
jfs

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

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
Hari Ganesan

1
@BornToCode: 1- Tôi biết . Nhìn vào bản sửa đổi (2008) bình luận của tôi trả lời (bình luận của tôi là về việc sử dụng lambda không cần thiết). 2- sắp xếp các ký tự không phải ASCII là một chủ đề riêng biệt lớn. PyICU có thể được sử dụng thay cho giải pháp dựa trên miền địa phương.
jfs

1
@Dmitry Điều này là do bạn đang in giá trị trả về của hàm sắp xếp được gọi trong [1, 2, 3].sort(). Khi sort()sắp xếp danh sách tại chỗ (nghĩa là thay đổi danh sách trực tiếp), nó sẽ không trả về danh sách đã sắp xếp và thực tế không trả về bất cứ điều gì, vì vậy câu lệnh in của bạn sẽ được in None. Nếu bạn đã lưu danh sách của mình vào một biến, giả sử x, được gọi x.sort(), sau đó print(x), bạn sẽ thấy danh sách được sắp xếp.
bjg222

56

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

for x in sorted(list):
    print x

Điều này trả về một phiên bản mới, được sắp xếp của 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 các 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 mylist.sort(key=lambda x: x.lower())sẽ hoạt động tốt đối với các bối cảnh chỉ có ASCII.


13

Vui lòng sử dụng hàm sort () trong Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

10

Nhưng làm thế nào để điều này xử lý các quy tắc sắp xếp cụ thể ngôn ngữ? Liệu nó có đưa địa phương vào tài khoản?

Không, list.sort()là một chức năng sắp xếp chung. Nếu bạn muốn sắp xếp theo quy tắc Unicode, bạn sẽ phải xác định 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.


1

Câu hỏi cũ, nhưng nếu bạn muốn thực hiện sắp xếp nhận thức địa phương mà không cần cài đặt, locale.LC_ALL bạn có thể làm như vậy bằng cách sử dụng thư viện PyICU như được đề xuất bởi câu trả lời này :

import icu # PyICU

def sorted_strings(strings, locale=None):
    if locale is None:
       return sorted(strings)
    collator = icu.Collator.createInstance(icu.Locale(locale))
    return sorted(strings, key=collator.getSortKey)

Sau đó gọi với vd:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Điều này làm việc cho tôi mà không cần cài đặt bất kỳ địa phương hoặc thay đổi cài đặt hệ thống khác.

(Điều này đã được đề xuất trong một nhận xét ở trên , nhưng tôi muốn làm cho nó nổi bật hơn, vì lúc đầu tôi đã bỏ lỡ nó.)


0

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

đó không phải là danh sách các chuỗi bạn đang sắp xếp ở đây
mnl

0

Hoặc có thể:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Kết quả

['abc', 'ba', 'cd', 'dc', 'xy']


0

Thật đơn giản: https://trinket.io/l Library / transfer / 5db81676e4

scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'

điểm = điểm.split (',') cho x trong sắp xếp (điểm): print (x)

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.