2010-08-06 55 views
69

Tôi biết rằng điều này nghe có vẻ tầm thường nhưng tôi không nhận ra rằng hàm sort() của Python là lạ. Tôi có một danh sách các "số" thực sự ở dạng chuỗi, vì vậy trước tiên tôi chuyển đổi chúng thành ints, sau đó cố gắng sắp xếp.Cách sắp xếp danh sách bằng số?

list1=["1","10","3","22","23","4","2","200"] 
for item in list1: 
    item=int(item) 

list1.sort() 
print list1 

Cung cấp cho tôi:

['1', '10', '2', '200', '22', '23', '3', '4'] 

Những gì tôi muốn là

['1','2','3','4','10','22','23','200'] 

Tôi đã nhìn xung quanh cho một số các thuật toán liên quan đến sắp xếp bộ số, nhưng những người tôi thấy tất cả liên quan đến sắp xếp các bộ chữ và số.

Tôi biết đây có thể là vấn đề không có trí tuệ nhưng google và sách giáo khoa của tôi không cung cấp bất kỳ thứ gì hữu ích hơn hoặc ít hơn chức năng .sort().

+7

Lưu ý rằng vòng lặp for của bạn không làm những gì tôi nghi ngờ bạn nghĩ. – deinst

+1

Không có lúc nào bạn cập nhật 'list1'. Điều gì khiến bạn nghĩ rằng 'danh sách' đã được cập nhật? –

+0

Vấn đề tương tự tăng lên khi list1 = ['1', '1.10', '1.11', '1.1', '1.2'] được cung cấp làm đầu vào. Thay vì nhận được kết quả đầu ra là ['1', '1.1', '1.2', '1.10', '1.11'], tôi nhận được ['1', '1.1', '1.10', '1.11', '1.2' ] – sathish

Trả lời

127

Bạn chưa thực sự chuyển đổi dây của bạn để ints. Hay đúng hơn là bạn đã làm, nhưng sau đó bạn không làm gì với kết quả. Những gì bạn muốn là:

list1 = ["1","10","3","22","23","4","2","200"] 
list1 = [int(x) for x in list1] 
list1.sort() 

Tuy nhiên, trăn làm cho nó dễ dàng hơn cho bạn: loại có một tham số được đặt tên, quan trọng, mà là một chức năng đó được gọi là trên mỗi phần tử trước khi nó được so sánh (nhưng mà không sửa đổi danh sách)

list1 = ["1","10","3","22","23","4","2","200"] 
# call int(x) on each element before comparing it 
list1.sort(key=int) 
+6

khi tôi thử khóa = int trong 2.7 Tôi nhận được Không có – KI4JGT

+0

@ KI4JGT: Nó hoạt động tốt với Python 3.3.2. – dfernan

+0

Điều này làm việc nếu phần tử danh sách được lưu trữ dưới dạng "số nguyên", cách xử lý trong trường hợp giá trị float? Ví dụ, list1 = [1, 1.10, 1.11, 1.1, 1.2] – sathish

28

Bạn có thể chuyển hàm đến thông số key tới the .sort method. Với điều này, hệ thống sẽ sắp xếp theo khóa (x) thay vì x.

list1.sort(key=int) 

BTW, để chuyển đổi danh sách các số nguyên vĩnh viễn, sử dụng the map function

list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x 

hoặc danh sách hiểu

list1 = [int(x) for x in list1] 
8

Sắp xếp của Python không lạ. Nó chỉ rằng mã này:

for item in list1: 
    item=int(item) 

không làm những gì bạn nghĩ rằng đó là - item không được thay thế trở lại vào danh sách, nó chỉ đơn giản là bỏ đi.

Dù sao, giải pháp đúng là sử dụng key=int khi những người khác đã hiển thị cho bạn.

+0

Ooh đó là một điểm tốt! Cảm ơn bạn! – Brian

13

Trong trường hợp bạn muốn sử dụng chức năng sorted(): sorted(list1, key=int)

Nó trả về một danh sách sắp xếp mới.

-1

Giải pháp gần đây nhất là đúng. Bạn đang đọc các giải pháp như một chuỗi, trong trường hợp đó thứ tự là 1, sau đó là 100, sau đó 104 theo sau là 2 rồi 21, sau đó là 2001001010, 3 và cứ thế.

Bạn phải CAST đầu vào của bạn như một int thay vì:

chuỗi sắp xếp:

stringList = (1, 10, 2, 21, 3)

ints sắp xếp:

intList = (1, 2, 3, 10, 21)

Để đúc, chỉ cần đặt các stringList bên trong int (blahblah).

Again:

stringList = (1, 10, 2, 21, 3) 

newList = int (stringList) 

print newList 

=> returns (1, 2, 3, 10, 21) 
+0

LoạiError: int() đối số phải là một chuỗi hoặc một số, không phải 'tuple' –

+0

Ngoài ra, các chuỗi trong chuỗiList của bạn nên có dấu ngoặc kép. – Teepeemm

+1

Đó là dự đoán của helluva: "giải pháp gần đây nhất là đúng";) – GreenAsJade

-1
scores = ['91','89','87','86','85'] 
scores.sort() 
print (scores) 

này làm việc cho tôi sử dụng python phiên bản 3, mặc dù nó không trong phiên bản 2.

+0

Hãy thử sắp xếp với '11 và '100' ở đó, đó là khi mọi thứ trở nên thú vị. – Penz

5

Bạn cũng có thể sử dụng:


import re 
def sort_human(l): 
    convert = lambda text: float(text) if text.isdigit() else text 
    alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] 
    l.sort(key=alphanum) 
    return l 
 

điều này rất giống với những thứ khác mà bạn có thể tìm thấy trên internet nhưng cũng hoạt động với các chữ số như [abc0.1, abc0.2 ..]

3

Câu trả lời của Seamus Campbell không hoạt động trên python2.x.
list1 = sorted(list1, key=lambda e: int(e)) sử dụng chức năng lambda hoạt động tốt.

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