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


127

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 sort()chức năng của Python là kỳ lạ. Tôi có một danh sách "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 đó thử sắp xếp.

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

list1.sort()
print list1

Đưa cho tôi:

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

Điều tôi muốn là

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

Tôi đã xem xét một số thuật toán liên quan đến việc sắp xếp các bộ số, nhưng những thuật toán tôi tìm thấy đều liên quan đến việc sắp xếp các bộ chữ và số.

Tôi biết điều này có lẽ không phải là vấn đề khôn ngoan nhưng google và sách giáo khoa của tôi không cung cấp bất cứ điều gì hữu ích hơn hoặc ít hơn .sort()chức năng.


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

1
Không có thời gian bạn đã cập nhật list1. Điều gì làm bạn nghĩ rằng listđã được cập nhật?
S.Lott

Vấn đề tương tự nêu 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 đầ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

2
trong python 3 bạn có thể muốn sử dụngsorted(mylist)
Akin Hwan

Câu trả lời:


191

Bạn chưa thực sự chuyển đổi chuỗi của bạn thành ints. Hay đúng hơn, 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()

Nếu vì lý do nào đó bạn cần giữ chuỗi thay vì ints (thường là một ý tưởng tồi, nhưng có lẽ bạn cần bảo toàn các số 0 đứng đầu hoặc một cái gì đó), bạn có thể sử dụng một chức năng chính . sortlấy một tham số được đặt tên, keylà một hàm được gọi trên mỗi phần tử trước khi nó được so sánh. Các giá trị trả về của hàm khóa được so sánh thay vì so sánh trực tiếp các phần tử 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)

8
khi tôi thử key = int trong 2.7 tôi không nhận được
KI4JGT

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

1
@ KI4JGT phương thức sắp xếp sửa đổi danh sách và trả về Không có. Vì vậy, thay vì list1 = list1.sort(key=int)sử dụng chỉ list1.sort(key=int)và list1 sẽ được sắp xếp.
Josiah Yoder

1
@ KI4JGT .sort () là một toán tử tại chỗ, nó trả về Không, nó sắp xếp danh sách, bạn có thể muốn sử dụng
sort

39

Bạn có thể vượt qua một chức năng để các keytham số để các .sortphương pháp . 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 các mapchức năng

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]

21

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

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


1
Làm việc với bộ quá!
MT

12

Loại của Python không lạ. Đó chỉ là mã này:

for item in list1:
   item=int(item)

không làm những gì bạn nghĩ - itemkhông bị thay thế trong danh sách, nó chỉ bị vứt đi.

Dù sao, giải pháp chính xác là sử dụng key=intnhư những người khác đã chỉ cho bạn.


12

Bạn cũng có thể 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 cho các chữ số như thế nào [abc0.1, abc0.2, ...].


8

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 lambdachức năng hoạt động tốt.


8

Tôi đã tiếp cận vấn đề tương tự ngày hôm qua và tìm thấy một mô-đun gọi là [natsort] [1], giải quyết vấn đề của bạn. Sử dụng:

from natsort import natsorted # pip install natsort

# Example list of strings
a = ['1', '10', '2', '3', '11']

[In]  sorted(a)
[Out] ['1', '10', '11', '2', '3']

[In]  natsorted(a)
[Out] ['1', '2', '3', '10', '11']

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

Nó cũng hoạt động cho từ điển như một tương đương sorted. [1]: https://pypi.org/project/natsort/


3

Hãy thử điều này, nó sẽ sắp xếp danh sách tại chỗ theo thứ tự giảm dần (không cần chỉ định khóa trong trường hợp này):

Quá trình

listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC

đầu ra:

 [48, 46, 25, 24, 22, 13, 8, -9, -15, -36]

0

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

Thay vào đó, bạn phải CAST đầu vào của bạn dưới dạng int:

chuỗi đã sắp xếp:

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

ints đã sắp xếp:

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

Để truyền, chỉ cần đặt chuỗiList bên trong int (blahblah).

Lần nữa:

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

newList = int (stringList)

print newList

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

1
Đối số TypeError: int () phải là một chuỗi hoặc một số, không phải là 'tuple'
Cees Timmerman

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

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

0

Nếu bạn muốn sử dụng chuỗi các số tốt hơn, hãy lấy một danh sách khác như trong mã của tôi, nó sẽ hoạt động tốt.

list1=["1","10","3","22","23","4","2","200"]

k=[]    
for item in list1:    
    k.append(int(item))

k.sort()
print(k)
# [1, 2, 3, 4, 10, 22, 23, 200]

0

Cách đơn giản để sắp xếp một danh sách số

numlists = ["5","50","7","51","87","97","53"]
results = list(map(int, numlists))
results.sort(reverse=False)
print(results)

-1

vấn đề thực sự là sắp xếp những thứ chữ và số. Vì vậy, nếu bạn có một danh sách ['1', '2', '10', '19'] và sắp xếp chạy, bạn sẽ nhận được ['1', '10'. '19', '2']. tức là 10 đến trước 2 vì nó nhìn vào ký tự đầu tiên và sắp xếp bắt đầu từ đó. Có vẻ như hầu hết các phương pháp trong python trả lại mọi thứ theo thứ tự đó. Ví dụ: nếu bạn có một thư mục có tên abc với các tệp có nhãn là 1.jpg, 2.jpg, v.v. hãy nói đến 15.jpg và bạn làm file_list = os.listdir (abc) thì file_list không được sắp xếp như bạn mong đợi mà là file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Nếu thứ tự mà các tệp được xử lý là quan trọng (có lẽ đó là lý do tại sao bạn đặt tên chúng theo số) thì thứ tự đó không phải là thứ bạn nghĩ. Bạn có thể tránh điều này bằng cách sử dụng phần đệm "số không". Ví dụ: nếu bạn có một danh sách alist = ['01', '03', '05', '10', '02', '04', '06] và bạn chạy sắp xếp theo thứ tự bạn muốn. alist = ['01', '02', v.v.] vì ký tự đầu tiên là 0 xuất hiện trước 1. Số lượng đệm số không bạn cần được xác định bởi giá trị lớn nhất trong danh sách. Ví dụ: nếu số lớn nhất được nói là từ 100 đến 1000 bạn cần phải điền các chữ số đơn như 001, 002 --- 010,011--100, 101, v.v.


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

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


3
Hãy thử sắp xếp với '11 và '100' ở đó, đó là khi mọi thứ trở nên thú vị.
Penz
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.