2012-03-18 102 views
38

Tôi đã tạo một cơ sở dữ liệu sqlite có bảng lưu trữ các giá trị nhiệt độ. Các giá trị nhiệt độ được ghi vào cơ sở dữ liệu theo thứ tự tăng dần lần đầu tiên. Sau đó, tôi đọc các giá trị nhiệt độ từ cơ sở dữ liệu vào một danh sách và sau đó thêm danh sách đó vào một hộp kết hợp để chọn nhiệt độ - hoạt động tốt.Python - cách sắp xếp danh sách các giá trị số theo thứ tự tăng dần

Danh sách kết quả là, nói:

templist = ['25', '50', '100', '150', '200', '250', '300']. 

Sau đó, tôi thêm một giá trị nhiệt độ mới, nói, '33' cơ sở dữ liệu.

Nó được nối vào cuối bảng. Nếu tôi đọc nhiệt độ bây giờ, danh sách sẽ trở thành:

['25', '50', '100', '150', '200', '250', '300', '33']. 

Nếu tôi làm templist.sort() hoặc sorted(templist), kết quả cuối cùng là

['150', '200', '25', '250', '300', '33', '50'] 

Có cách nào đơn giản để sắp xếp danh sách theo thứ tự tăng dần để mà tôi nhận được:

['25', '33', '50', '100', '150', '200', '250', '300'] 
+7

Tôi muốn nói rằng bạn gặp sự cố với loại nội dung trong danh sách của mình. Nếu chúng sắp xếp như vậy, chúng có thể là chuỗi thay vì số nguyên. Nếu không nhìn thấy mã đưa chúng ra khỏi sqlite và lược đồ của bạn, thật khó để đề xuất giải pháp phù hợp cho bạn. –

Trả lời

57

Phương pháp đề nghị trong trường hợp này là để sắp xếp dữ liệu trong cơ sở dữ liệu , thêm một ORDER BY ở phần cuối của các truy vấn mà fetches các kết quả, một cái gì đó như thế này:

SELECT temperature FROM temperatures ORDER BY temperature ASC; -- ascending order 
SELECT temperature FROM temperatures ORDER BY temperature DESC; -- descending order 

Nếu vì một lý do nào đó không phải là một lựa chọn, bạn có thể thay đổi thứ tự sắp xếp như thế này trong Python:

templist = [25, 50, 100, 150, 200, 250, 300, 33] 
sorted(templist, key=int)    # ascending order 
> [25, 33, 50, 100, 150, 200, 250, 300] 
sorted(templist, key=int, reverse=True) # descending order 
> [300, 250, 200, 150, 100, 50, 33, 25] 

Như đã được chỉ trong các ý kiến, chìa khóa int (hoặc float nếu giá trị với số thập phân đang được lưu trữ) là bắt buộc để phân loại một cách chính xác các dữ liệu nếu dữ liệu nhận được là loại string, nhưng nó muốn được rất lạ để lưu trữ các giá trị nhiệt độ dưới dạng chuỗi, nếu đúng như vậy, quay lại và khắc phục vấn đề ở gốc, và đảm bảo rằng nhiệt độ được lưu trữ là số.

+0

sử dụng đơn đặt hàng bởi sẽ có cùng một vấn đề nếu dữ liệu là chuỗi. vấn đề cơ bản là dữ liệu không phải là số nguyên. –

+0

@andrewcooke cảm ơn, đã sửa nó –

+0

được sắp xếp (templist, key = float) chính xác là những gì tôi cần. Cảm ơn bạn. Tôi không thể tìm thấy thủ thuật 'key = float' ở bất cứ đâu. Tôi đã cho thấy không chính xác (tôi sẽ thay đổi nó ở trên) liệt kê rằng đó là danh sách các chuỗi chứ không phải danh sách các số. Tôi đã gặp một số vấn đề khi xử lý các float trong cơ sở dữ liệu, chủ yếu khi tìm kiếm một giá trị cụ thể (nếu float không hoàn toàn bằng số tôi tìm kiếm, tôi không nhận được kết quả nào), đó là lý do tại sao tôi thay đổi mọi thứ thành chuỗi. Có vẻ dễ dàng hơn khi thực hiện các tìm kiếm khác nhau trên các chuỗi thay vì các số phao. – linuxoid

25

trong python sorted hoạt động giống như bạn muốn với số nguyên:

>>> sorted([10,3,2]) 
[2, 3, 10] 

nó trông giống như bạn gặp rắc rối bởi vì bạn đang sử dụng chuỗi:

>>> sorted(['10','3','2']) 
['10', '2', '3'] 

(vì chuỗi trật tự bắt đầu với ký tự đầu tiên, và "1" đến trước "2", không có vấn đề gì nhân vật theo) có thể được cố định với key=int

>>> sorted(['10','3','2'], key=int) 
['2', '3', '10'] 

mà chuyển đổi các giá trị để nguyên trong các loại (nó được gọi là một hàm - int('10') trả về số nguyên 10)

và theo đề nghị trong các ý kiến, bạn cũng có thể sắp xếp danh sách riêng của mình, chứ không phải là tạo ra một hình mới:

>>> l = ['10','3','2'] 
>>> l.sort(key=int) 
>>> l 
['2', '3', '10'] 

nhưng tôi sẽ xem xét lý do tại sao bạn có dây ở tất cả. bạn sẽ có thể lưu và lấy số nguyên. có vẻ như bạn đang lưu một chuỗi khi bạn nên lưu một int? (sqlite là không bình thường giữa các cơ sở dữ liệu, trong đó nó loại dữ liệu lưu trữ trong cùng một loại như nó được đưa ra, ngay cả khi loại cột bảng là khác nhau).

và một khi bạn bắt đầu tiết kiệm nguyên, bạn cũng có thể nhận được danh sách lại được sắp xếp từ sqlite bằng cách thêm order by ... để lệnh sql:

select temperature from temperatures order by temperature; 
+2

Từ 3k ['sắp xếp()' doc] (http://docs.python.org/py3k/library/functions.html#sorted): * Trả về một danh sách mới được sắp xếp ** ** từ các mục có thể lặp lại. * –

+0

oh, bạn nói đúng. xin lỗi/cảm ơn - sẽ sửa. –

+1

và trên phản ánh có ý nghĩa, bởi vì bạn cần phải xem xét toàn bộ một chuỗi để sắp xếp nó, do đó bạn không thể có trình tạo phân loại tránh danh sách nội bộ. –

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