Tôi muốn giữ một đống đồ vật, không chỉ là số. Họ sẽ có một thuộc tính số nguyên trong đó đống có thể sắp xếp theo. Cách dễ nhất để sử dụng heaps trong python là heapq, nhưng làm thế nào để tôi nói với nó để sắp xếp theo một thuộc tính cụ thể khi sử dụng heapq?Làm thế nào để làm cho heapq đánh giá heap off của một thuộc tính cụ thể?
Trả lời
heapq
cả các loại đối tượng theo cùng một cách list.sort
không, vì vậy chỉ cần xác định một phương pháp __cmp__()
trong định nghĩa lớp học của bạn, mà sẽ so sánh bản thân với một thể hiện của cùng lớp:
def __cmp__(self, other):
return cmp(self.intAttribute, other.intAttribute)
trình bằng Python 2.x.
Trong sử dụng 3.x:
def __lt__(self, other):
return self.intAttribute < other.intAttribute
Thật không may, bạn không thể, mặc dù đây là tính năng thường được yêu cầu.
Một tùy chọn sẽ là chèn (khóa, giá trị) vào bộ nhớ. Tuy nhiên, điều đó sẽ không hoạt động nếu các giá trị ném một ngoại lệ khi so sánh (chúng sẽ được so sánh trong trường hợp liên kết giữa các khóa).
Tùy chọn thứ hai là xác định phương thức __lt__
(ít hơn) trong lớp sẽ sử dụng thuộc tính thích hợp để so sánh các phần tử để sắp xếp. Tuy nhiên, điều đó có thể không thực hiện được nếu các đối tượng được tạo bởi một gói khác hoặc nếu bạn cần chúng để so sánh ở một nơi khác trong chương trình.
Tùy chọn thứ ba sẽ là sử dụng lớp sortedlist từ mô-đun blist (tuyên bố từ chối trách nhiệm: Tôi là tác giả). Hàm tạo cho số sortedlist
có tham số key
cho phép bạn chỉ định hàm trả về khóa sắp xếp của phần tử, tương tự như thông số key
của list.sort
và sorted
.
Tôi đã xóa nhận xét trước của mình vì vấn đề của tôi với 'blist' có lẽ là PEBCAK (nhờ mô-đun của bạn), vì vậy tôi chỉ sao chép phần đầu tiên của nhận xét trước: Bạn luôn có thể xác định lớp học bằng' __lt__ 'hoặc thông qua phân lớp hoặc thông qua đóng gói. – tzot
Theo ví dụ từ documentation, bạn có thể sử dụng các bộ, và nó sẽ sắp xếp theo các yếu tố đầu tiên của tuple:
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
Vì vậy, nếu bạn không muốn (hoặc không thể?) làm phương pháp __cmp__
, bạn có thể trích xuất thủ công khóa sắp xếp của mình tại thời điểm đẩy.
Lưu ý rằng nếu các phần tử đầu tiên trong một cặp tuples bằng nhau, các phần tử khác sẽ được so sánh. Nếu đây không phải là những gì bạn muốn, bạn cần đảm bảo rằng mỗi phần tử đầu tiên là duy nhất.
- 1. Làm thế nào để tìm kiếm một NSSet hoặc NSArray cho một đối tượng có giá trị cụ thể cho một thuộc tính cụ thể?
- 2. Thay đổi giá trị của một thuộc tính cụ thể
- 3. Làm thế nào để đặt thuộc tính ngữ cảnh log4net cụ thể cho một yêu cầu ASP.NET?
- 4. Làm thế nào tôi có thể buộc PropertyGrid hiển thị hộp thoại tùy chỉnh cho một thuộc tính cụ thể?
- 5. Làm thế nào để thiết lập một thuộc tính Xcode trong CMake cho một cấu hình cụ thể?
- 6. Làm thế nào để làm cho giá trị setter gửi thuộc tính thông qua hàm SQL
- 7. Làm thế nào để sử dụng LINQ để xác định nếu giá trị thuộc tính cụ thể tồn tại?
- 8. Làm cách nào tôi có thể gán một thuộc tính cho một thuộc tính
- 9. Làm cách nào để có được thuộc tính hệ thống cho một cá thể JVM cụ thể theo lập trình?
- 10. Làm thế nào tôi có thể gán một thuộc tính cho một đối tượng jQuery?
- 11. Làm thế nào tôi có thể làm cho một constructor của cấu trúc đánh giá tuần tự trong Common Lisp?
- 12. Làm thế nào để thay thế một giá trị trong web.xml bằng thuộc tính Maven?
- 13. Làm thế nào để đặt thuộc tính chuyển đổi cho mỗi hàng của một datatable?
- 14. Làm thế nào để tìm ra giá trị tính toán của thuộc tính lang của một phần tử trong JavaScript?
- 15. Đánh giá và tạo thuộc tính lớp
- 16. Làm thế nào để loại bỏ thuộc tính cụ thể từ JSON chuỗi bằng C#
- 17. Làm thế nào để thêm các thuộc tính để tính một lớp cơ sở của
- 18. Làm cách nào để kích hoạt một sổ làm việc cụ thể và một trang tính cụ thể?
- 19. Làm thế nào một thuộc tính có thể được gán cho tập hợp thuộc tính cụ thể được lập trình thông qua API Magento?
- 20. Làm thế nào để liên kết một thuộc tính boolean với thuộc tính rendered?
- 21. Làm thế nào để bỏ qua một thuộc tính cụ thể khi deserializing một đối tượng JSON?
- 22. Làm thế nào để Mock một thuộc tính thiếu
- 23. C# Làm thế nào để đặt giá trị mặc định cho các thuộc tính tự động?
- 24. Làm thế nào để bạn lập trình một thuộc tính?
- 25. truy vấn XPath như thế nào để có được giá trị của một thuộc tính dựa trên hai thuộc tính
- 26. Làm thế nào để tăng kích thước Heap của JVM
- 27. Làm thế nào để thay đổi giá trị thuộc tính của file svg
- 28. C#: Làm thế nào để thiết lập giá trị mặc định cho một thuộc tính trong một lớp một phần?
- 29. MATLAB Đánh giá Lười biếng trong Thuộc tính Phụ thuộc
- 30. Tôi có thể từ chối giá trị trong thuộc tính sử dụng "Đánh giá" không?
'__cmp__' đã biến mất trong 3.x. Sử dụng '__lt__' để thay thế. –
'__lt__' cũng hoạt động trong Python 2, vì vậy tốt hơn hết là tránh' __cmp__' hoàn toàn. –
Cũng giống như bạn có thể phân loại dựa trên tiêu chí khác với phân loại tự nhiên của đối tượng (ví dụ 'cmp' và' key' cho 'sort'), bạn có thể nói' heapq' để sắp xếp dựa trên khóa khác. Nói cách khác, bạn không cần phải * xác định lại chính đối tượng * để thay đổi một cấu trúc dữ liệu cụ thể đang nắm giữ nó; bạn sẽ có thể tự nói với cấu trúc dữ liệu. Đây là một phần cơ bản đáng chú ý còn thiếu trong API 'heapq'. –