Skip to content

Commit 7cbf68f

Browse files
committed
new dict
1 parent cdb3a6e commit 7cbf68f

1 file changed

Lines changed: 57 additions & 0 deletions

File tree

newcodes/answers/q72.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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

Comments
 (0)