2013-10-14 42 views
8

Tôi có một danh sách đó bao gồm các chi tiết như thế này:Sắp xếp theo python - cách sắp xếp danh sách chứa các giá trị chữ và số?

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 

bây giờ, tôi muốn sắp xếp danh sách này, như vậy mà giá trị theo thứ tự sau:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"] 

Chỉ cần làm list1.sort() rõ ràng không đưa ra câu trả lời đúng - nó mang lại:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"] 

tôi giả định này là bởi vì đối xử với tất cả python đây là các chuỗi trực tiếp. Tuy nhiên, tôi muốn sắp xếp chúng dựa trên giá trị số FIRST của chúng, và sau đó là ký tự theo sau số.

Tôi làm cách nào để tiếp tục?

Cảm ơn bạn rất nhiều :)

+0

Xem bài đăng này (http://stackoverflow.com/questions/11850425/custom-python-list-sorting) và xác định hàm so sánh tùy chỉnh. – lurker

+2

Điều này được gọi là ** sắp xếp tự nhiên **. có thể trùng lặp của [Python có được xây dựng trong chức năng cho chuỗi tự nhiên sắp xếp?] (http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural- sắp xếp) –

Trả lời

11

Bạn muốn sử dụng natural sort:

import re 

_nsre = re.compile('([0-9]+)') 
def natural_sort_key(s): 
    return [int(text) if text.isdigit() else text.lower() 
      for text in re.split(_nsre, s)] 

Ví dụ sử dụng:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 
>>> list1.sort(key=natural_sort_key) 
>>> list1 
['1', '2C', '36', '100A', '132', '302F', '342B'] 

này chức năng bằng cách tách các yếu tố vào danh sách tách ra những con số và so sánh chúng như số nguyên thay vì chuỗi:

>>> natural_sort_key("100A") 
['', 100, 'a'] 
>>> natural_sort_key("342B") 
['', 342, 'b'] 

Lưu ý rằng điều này chỉ hoạt động trong Python3 nếu bạn luôn được so sánh ints với ints và chuỗi với chuỗi, nếu không bạn sẽ có được một ngoại lệ TypeError: unorderable types.

+1

Lưu ý rằng đối với Python 3 tất cả các mặt hàng phải có cấu trúc tương tự. '['a1', '2b']' sẽ thất bại với 'TypeError'. –

+0

@StevenRumbalski: ah tôi quên mất điều đó, cảm ơn. Tôi sẽ đề cập đến nó. – Claudiu

0

Vâng, trước tiên bạn phải tìm cách chuyển đổi chuỗi của mình thành số. Ví dụ

import re 
def convert(str): 
    return int("".join(re.findall("\d*", str))) 

và sau đó bạn sử dụng nó như một chìa khóa loại:

list1.sort(key=convert) 
+0

Có một số giải pháp sắp xếp tự nhiên hơn tại đây: http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – nofinator

Các vấn đề liên quan