keker123

Untitled

Jun 28th, 2023 (edited)
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 KB | None | 0 0
  1. from collections.abc import Iterator, MutableSequence, Iterable
  2. class LazyList(MutableSequence):
  3.     def __init__(self, items: Iterable):
  4.         self.generator = iter(items)
  5.         self.items_ = []
  6.  
  7.     def insert(self, index: int, value) -> None:
  8.         self._next(index)
  9.         self.items_.insert(index, value)
  10.  
  11.     def _next(self, index):
  12.         if isinstance(index, slice):
  13.             max_index = index.stop
  14.         else:
  15.             max_index = index
  16.         if max_index is None:
  17.             for it in self.generator:
  18.                 self.items_.append(it)
  19.         else:
  20.             while len(self.items_) <= max_index:
  21.                 try:
  22.                     self.items_.append(next(self.generator))
  23.                 except StopIteration:
  24.                     break
  25.                    
  26.     def append(self, value):
  27.         self.items_.append(value)
  28.  
  29.     def extend(self, values: Iterable) -> None:
  30.         self.items_.extend(values)
  31.  
  32.     def __getitem__(self, index):
  33.         self._next(index)
  34.         return self.items_[index]
  35.  
  36.     def __setitem__(self, index, value) -> None:
  37.         self._next(index)
  38.         self.items_[index] = value
  39.  
  40.     def __delitem__(self, index) -> None:
  41.         self._next(index)
  42.         del self.items_[index]
  43.  
  44.     def __contains__(self, x) -> bool:
  45.         if x in self.items_:
  46.             return True
  47.         for item in self.generator:
  48.             self.items_.append(item)
  49.             if item == x:
  50.                 return True
  51.         return False
  52.  
  53.     def __len__(self) -> int:
  54.         for x in self.generator:
  55.             self.items_.append(x)
  56.         return len(self.items_)
  57.  
  58.     def __reversed__(self) -> Iterator:
  59.         for x in self.generator:
  60.             self.items_.append(x)
  61.         return reversed(self.items_)
  62.  
  63.     def __iter__(self) -> Iterator:
  64.         index = 0
  65.         while True:
  66.             try:
  67.                 yield self[index]
  68.                 index += 1
  69.             except IndexError:
  70.                 break
  71.  
  72.     def __eq__(self, other):
  73.         if isinstance(other, MutableSequence):
  74.             return list(self) == other
  75.         elif isinstance(other, LazyList):
  76.             return list(self) == list(other)
  77.         return False
  78.  
  79.  
  80.  
  81. def test_lazify_list():
  82.     lst = [1, 2, 3, 4, 5]
  83.  
  84.     lazy_list = LazyList(lst)
  85.  
  86.     assert lst == lazy_list
  87.     assert len(lst) == len(lazy_list)
  88.     assert list(reversed(lst)) == list(reversed(lazy_list))
  89.     assert 4 in lazy_list
  90.  
  91.     lst.append(100)
  92.     lazy_list.append(100)
  93.     assert lst == lazy_list
  94.  
  95.     lst.extend([1, 2, 3])
  96.     lazy_list.extend([1, 2, 3])
  97.     assert lst == lazy_list
  98.  
  99.     del lazy_list[1]
  100.     assert lazy_list == [1, 3, 4, 5, 100, 1, 2, 3]
  101.     assert lazy_list[:2] == [1, 3]
  102.     print(lazy_list[6:])
  103.  
  104.  
  105. def factorials():
  106.     value = 1
  107.     i = 1
  108.     while True:
  109.         yield value
  110.         value *= i
  111.         i += 1
  112.  
  113.  
  114. def test_infinite_list():
  115.     all_factorials = LazyList(factorials())
  116.     print(all_factorials[4:7])
  117.     assert all_factorials[4:7] == [24, 120, 720]
  118.     assert all_factorials[:7] == [1, 1, 2, 6, 24, 120, 720]
  119.     assert all_factorials[7] == 5040
  120.     del all_factorials[6]
  121.     assert all_factorials[6] == 5040
  122.     all_factorials[:6] = [1]
  123.     assert all_factorials[:2] == [1, 5040]
  124.     del all_factorials[:2]
  125.     assert all_factorials[:2] == [40320, 362880]
  126.     all_factorials.append(100500)
  127.     all_factorials.extend([1, 2, 3])
  128.     assert any(factorial > 100000000 for factorial in all_factorials)
  129.     assert not all(factorial < 500000 for factorial in all_factorials)
  130.     assert 1307674368000 in all_factorials
  131.  
  132.  
  133. def main():
  134.     test_lazify_list()
  135.     test_infinite_list()
  136.  
  137.  
  138. if __name__ == '__main__':
  139.     main()
Advertisement
Add Comment
Please, Sign In to add comment