Advertisement
punkoff

big_matrix

Apr 8th, 2020
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.33 KB | None | 0 0
  1. import typing
  2.  
  3.  
  4. class BBMatr:
  5.     """Разреженная бинарная матрица с возможностью итерирования по столбцам и по строкам"""
  6.     def __init__(self):
  7.         self.rows_by_col : typing.Dict[int, set]  = dict()
  8.         self.cols_by_row: typing.Dict[int, set] = dict()
  9.  
  10.     def __sizeof__(self):
  11.         return sum(map(sys.getsizeof, [self.rows_by_col, self.cols_by_row,]))
  12.  
  13.     def __setitem__(self, key, value: bool):
  14.         r, c = key
  15.         rows_by_col = self.rows_by_col
  16.         cols_by_row = self.cols_by_row
  17.         rows = rows_by_col.setdefault(c, set())
  18.         cols = cols_by_row.setdefault(r, set())
  19.         if value:
  20.             rows.add(r)
  21.             cols.add(c)
  22.         else:
  23.             rows.discard(r)
  24.             cols.discard(c)
  25.  
  26.         if not rows:
  27.             rows_by_col.pop(c)
  28.  
  29.         if not cols:
  30.             cols_by_row.pop(r)
  31.  
  32.     def __getitem__(self, key):
  33.         r, c = key
  34.         return c in self.cols_by_row.get(r, set())
  35.  
  36.     def __iter__(self):
  37.         for r, cols in self.cols_by_row.items():
  38.             for c in cols:
  39.                 yield r, c
  40.  
  41.     def iter_cols_by_row(self, r):
  42.         yield from self.cols_by_row.get(r, [])
  43.  
  44.     def iter_rows_by_col(self, c):
  45.         yield from self.rows_by_col.get(c, [])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement