| 4 | from bisect import bisect_left, insort_left |
| 5 | |
| 6 | class Ratings(dict): |
| 7 | def __init__(self, *args, **kwargs): |
| 8 | dict.__init__(self, *args, **kwargs) |
| 9 | self._rating = [(v, k) for k, v in dict.items(self)] |
| 10 | self._rating.sort() |
| 11 | print(self._rating) |
| 12 | def copy(self): |
| 13 | return Ratings(self) |
| 14 | |
| 15 | def __setitem__(self, k, v): |
| 16 | if k in self: |
| 17 | del self._rating[self.rating(k)] |
| 18 | dict.__setitem__(self, k, v) |
| 19 | insort_left(self._rating, (v, k)) |
| 20 | |
| 21 | def __delitem__(self, k): |
| 22 | del self._rating[self.rating(k)] |
| 23 | dict.__delitem__(self, k) |
| 24 | |
| 25 | __len__ = dict.__len__ |
| 26 | __contains__ = dict.__contains__ |
| 27 | |
| 28 | def __iter__(self): |
| 29 | for v,k in self._rating: |
| 30 | yield k |
| 31 | |
| 32 | iterkeys = __iter__ |
| 33 | |
| 34 | def keys(self): |
| 35 | return list(self) |
| 36 | |
| 37 | def rating(self, key): |
| 38 | item = self[key], key |
| 39 | i = bisect_left(self._rating, item) |
| 40 | print(i) |
| 41 | if item == self._rating[i]: |
| 42 | return i |
| 43 | raise LookupError("item not found in rating") |
| 44 | |
| 45 | def get_value_by_rating(self, rating): |
| 46 | return self._rating[rating][0] |
| 47 | |
| 48 | def get_key_by_rating(self, rating): |
| 49 | return self._rating[rating][1] |
| 50 | |
| 51 | if __name__ == "__main__": |
| 52 | d = {"zhangsan":78, "lisi":98, "wangwu":76, "zhaoliu":82} |