Câu trả lời:
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 - key
chỉ đượ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_key
là 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)
mylist.sort(key=str.lower)
nhanh hơn.
[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.
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.
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.
Vui lòng sử dụng hàm sort () trong Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
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.
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ó.)
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()))
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)
locale
và đó 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.