Sắp xếp một tập hợp các giá trị [đã đóng]


112

Tôi có các giá trị như thế này:

set(['0.000000000', '0.009518000', '10.277200999', '0.030810999', '0.018384000', '4.918560000'])
set(['4.918859000', '0.060758000', '4.917336999', '0.003949999', '0.013945000', '10.281522000', '0.025082999'])  

Tôi muốn sắp xếp các giá trị trong mỗi setthứ tự tăng dần. Tôi không muốn sắp xếp giữa các bộ, nhưng các giá trị trong mỗi bộ.


3
Các bộ giá trị có liên quan gì đến vấn đề này và bạn đã thử những gì?
Fred Foo

3
Tôi không nghĩ rằng bộ python có khái niệm về thứ tự. Điều này có thể giúp bạn: stackoverflow.com/questions/1653970/...
zallarak

3
một tập hợp là không có thứ tự. đó là một trong những thuộc tính của nó. bằng mọi ngôn ngữ. sử dụng a list.
Karoly Horvath

4
@KarolyHorvath "một tập hợp là không có trật tự. Đó là một trong những thuộc tính của nó. Ở mọi ngôn ngữ." C ++ std::setđược đặt hàng.
Timothy Shields

17
Tại sao mọi người lại đóng (hoặc lạc đề) câu hỏi này sau khi thực tế? Đúng vậy, sẽ tốt hơn nếu OP mô tả vấn đề của anh ấy thay vì bắt chúng tôi giải quyết vấn đề của anh ấy. Nhưng bây giờ chúng tôi đã làm điều đó và chỉnh sửa câu hỏi của anh ấy cho phù hợp, và anh ấy đã chấp nhận một câu trả lời, tôi không hiểu việc bỏ phiếu sát sao có ý nghĩa như thế nào.
abarnert

Câu trả lời:


218

Từ một bình luận:

Tôi muốn sắp xếp từng bộ.

Thật dễ dàng. Đối với bất kỳ tập hợp nào s(hoặc bất kỳ tập hợp nào khác có thể lặp lại), sorted(s)trả về danh sách các phần tử stheo thứ tự được sắp xếp:

>>> s = set(['0.000000000', '0.009518000', '10.277200999', '0.030810999', '0.018384000', '4.918560000'])
>>> sorted(s)
['0.000000000', '0.009518000', '0.018384000', '0.030810999', '10.277200999', '4.918560000']

Lưu ý rằng sortedđang cung cấp cho bạn một list, không phải a set. Đó là bởi vì toàn bộ điểm của một tập hợp, cả trong toán học và trong hầu hết mọi ngôn ngữ lập trình , * là nó không có thứ tự: các tập hợp {1, 2}{2, 1}là cùng một tập hợp.


Bạn có thể không thực sự muốn sắp xếp các phần tử đó dưới dạng chuỗi, nhưng dưới dạng số (vì vậy 4.918560000 sẽ đến trước 10.277200999 chứ không phải sau).

Giải pháp tốt nhất có nhiều khả năng là lưu trữ các số dưới dạng số hơn là chuỗi ngay từ đầu. Nhưng nếu không, bạn chỉ cần sử dụng một keyhàm:

>>> sorted(s, key=float)
['0.000000000', '0.009518000', '0.018384000', '0.030810999', '4.918560000', '10.277200999']

Để biết thêm thông tin, hãy xem Cách phân loại HOWTO trong tài liệu chính thức.


* Xem các bình luận để biết các trường hợp ngoại lệ.


1
@TimothyShields: Bạn nói đúng, tôi nên nói "mọi ngôn ngữ lập trình không thích sử dụng sai các thuật ngữ thông thường". Trong một ngôn ngữ mà "không thay đổi" có nghĩa là "đột biến", nó không ngạc nhiên khi setcó nghĩa là "danh sách được sắp xếp", và bạn phải nói unordered_setcó nghĩa là "set" ...
abarnert

2
Tên đó tốt hay xấu không phải là điều cần bàn. Tuyên bố rằng "các tập hợp không bao giờ được sắp xếp theo bất kỳ ngôn ngữ nào" là sai.
Timothy Shields

5
Bạn sẽ không tìm thấy từ "không có thứ tự" trên trang Wikipedia về một tập hợp toán học. Bạn cũng sẽ không tìm thấy từ "đã đặt hàng". Đó là bởi vì nó không liên quan đến các phép toán trên tập hợp. Việc một ngôn ngữ cụ thể chọn để tạo các tập hợp có thứ tự hay không là một chi tiết triển khai. en.wikipedia.org/wiki/Set_(mathematics)
Timothy Shields

3
@TimothyShields: Trong khi đó, trang wikipedia trên Set (toán học) mà bạn đã liên kết không có từ "không có thứ tự" vì nó đã rõ ràng từ định nghĩa. Đặc biệt, "Tập hợp A và B bằng nhau nếu và chỉ khi chúng có chính xác các phần tử giống nhau". Điều đó không đúng với các bộ sưu tập được đặt hàng. (Cũng có những câu như: "Thứ tự liệt kê các phần tử của một tập hợp hoặc nhiều tập hợp là không liên quan", vì vậy nếu bạn chỉ tìm kiếm khác đi một chút, bạn có thể tìm thấy nó ngay cả khi không hiểu khái niệm.)
abarnert

3
@TimothyShields: Nhưng std::set không tiết lộ thứ tự (không chỉ theo những cách rõ ràng thông qua API; chức năng đặt hàng thực sự là một phần của kiểu của bất kỳ tập hợp nhất định nào). Thực tế là các phần tử luôn được sắp xếp theo một thứ tự yếu nghiêm ngặt là một phần của định nghĩa của khái niệm. Vì vậy, lập luận của bạn là tranh luận. Nhưng ngay cả khi nó không, tại sao nó lại quan trọng? Các bộ không có thứ tự trong hầu hết mọi ngôn ngữ lập trình, giống như chúng trong toán học. Thực tế là có một ngôn ngữ bên ngoài sử dụng từ này để có nghĩa khác không làm cho câu nói đó trở nên kém đúng hơn.
abarnert
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.