|
| 1 | +#!/usr/bin/env python |
| 2 | +# coding=utf-8 |
| 3 | + |
| 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} |
| 53 | + print(d) |
| 54 | + r = Ratings(d) |
| 55 | + print(r.keys()) |
| 56 | + print(r.get_value_by_rating(0)) |
| 57 | + print(r.rating("zhangsan")) |
0 commit comments