Guest User

Untitled

a guest
Jul 19th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. from operator import itemgetter
  2. from heapq import nlargest
  3. class bag(object):
  4. def __init__(self, iterable=()):
  5. self._data = {}
  6. self.update(iterable)
  7. def update(self, iterable):
  8. if isinstance(iterable, dict):
  9. for elem, n in iterable.iteritems():
  10. self[elem] += n
  11. else:
  12. for elem in iterable:
  13. self[elem] += 1
  14. def __contains__(self, elem):
  15. return elem in self._data
  16. def __getitem__(self, elem):
  17. return self._data.get(elem, 0)
  18. def __setitem__(self, elem, n):
  19. self._data[elem] = n
  20. if 0 == n:
  21. del self._data[elem]
  22. def __delitem__(self, elem):
  23. self[elem] = 0
  24. def __len__(self):
  25. return sum(self._data.itervalues())
  26. def __nonzero__(self):
  27. return bool(self._data)
  28. def __eq__(self, other):
  29. if not isinstance(other, bag):
  30. return False
  31. return self._data == other._data
  32. def __ne__(self, other):
  33. return not (self == other)
  34. def __hash__(self):
  35. raise TypeError
  36. def __repr__(self):
  37. return '%s(%r)' % (self.__class__.__name__, self._data)
  38. def copy(self):
  39. return self.__class__(self._data)
  40. __copy__ = copy
  41. def clear(self):
  42. self._data.clear()
  43. def __iter__(self):
  44. for elem, cnt in self._data.iteritems():
  45. for i in xrange(cnt):
  46. yield elem
  47. def iterunique(self):
  48. return self._data.iterkeys()
  49. def itercounts(self):
  50. return self._data.iteritems()
  51. def mostcommon(self, n=None):
  52. if n is None:
  53. return sorted(self.itercounts(), key=itemgetter(1), reverse=True)
  54. it = enumerate(self.itercounts())
  55. nl = nlargest(n, ((cnt, i, elem) for (i, (elem, cnt)) in it))
  56. return [(elem, cnt) for cnt, i, elem in nl]
  57.  
  58. if __name__ == '__main__':
  59. b = bag('banana')
  60. b._data
  61. b['a']
Add Comment
Please, Sign In to add comment