Ý tưởng của bạn là tốt, tuy nhiên trình lặp lặp mặc định chỉ nằm trên các khóa, vì vậy ví dụ của bạn sẽ chỉ trả lại khóa cuối cùng. Những gì bạn thực sự muốn là:
class MyOrderedDict(OrderedDict):
def last(self):
return list(self.items())[-1]
Điều này cung cấp cho các cặp (key, value)
, không chỉ các phím, như bạn muốn.
Lưu ý rằng trên các phiên bản trước bằng 3.x của Python, OrderedDict.items()
trả về một danh sách, vì vậy bạn không cần cuộc gọi list()
, nhưng các phiên bản sau sẽ trả lại dictionary view object, vì vậy bạn sẽ làm như vậy.
Edit: Như đã đề cập trong các ý kiến, hoạt động nhanh hơn là để làm:
class MyOrderedDict(OrderedDict):
def last(self):
key = next(reversed(self))
return (key, self[key])
Mặc dù tôi phải thừa nhận tôi tìm thấy điều này xấu xí trong mã (Tôi chưa bao giờ thích nhận được chìa khóa sau đó làm x[key]
để có được giá trị một cách riêng biệt, tôi thích nhận được (key, value)
tuple) - tùy thuộc vào tầm quan trọng của tốc độ và sở thích của bạn, bạn có thể chọn tùy chọn cũ.
Nguồn
2012-03-28 23:46:55
Nhưng điều đó chỉ trả về khóa của mục cuối cùng trong OD, phải không? không phải toàn bộ mục (khóa, giá trị). 'next (đảo ngược (OrderedDict ([(0, 'a'), (1, 'b'), (2, 'c')])))' cho '2' không' (2, 'c') ' – hobs
@hobs: Có, nó chỉ cung cấp cho bạn chìa khóa. Làm thế nào để có được giá trị cho chìa khóa còn lại như là một bài tập cho người đọc. :) –
:) vì vậy nó là O (2) cho vấn đề của OP. chi tiết Tôi biết ... – hobs