Advertisement
Woobinda

Update array of objects

Feb 10th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.24 KB | None | 0 0
  1. data = [{"Quantity":2.00000000,"Rate":0.01136095},{"Quantity":0.43919514,"Rate":0.01135600},{"Quantity":4.45801024,"Rate":0.01135177},{"Quantity":0.17621254,"Rate":0.01134993},{"Quantity":67.09999000,"Rate":0.01134678},{"Quantity":0.09310000,"Rate":0.01133930}]
  2.  
  3. new_data_example = [{"Quantity":0,"Rate":0.01136095},{"Quantity":0.0005,"Rate":0.01135600},{"Quantity":0.0015,"Rate":0.09}]
  4.  
  5.  
  6. def update_data(new_data=new_data_example, old_data=data):
  7.     for i, old_obj in enumerate(old_data):
  8.         for idx, new_obj in enumerate(new_data):
  9.  
  10.             if old_obj.get('Rate') == new_obj.get('Rate'):
  11.  
  12.                 if new_obj.get('Quantity') == 0:
  13.                     old_data.pop(i)
  14.                 else:
  15.                     old_obj['Quantity'] = new_obj.get('Quantity')
  16.  
  17.                 new_data.pop(idx)
  18.  
  19.     if new_data:
  20.         for obj in new_data:
  21.             old_data.append(obj)
  22.         return sorted(old_data, key=lambda obj: obj.get('Rate'))
  23.  
  24.     return old_data
  25.  
  26. update_data(new_data=new_data_example, old_data=data)
  27.  
  28.  
  29. #############################
  30. In OOP
  31. #############################
  32.  
  33. def get_default_setup():
  34.  
  35.     import sys
  36.  
  37.     try:
  38.         QRobjArray = getattr(sys.modules[__name__], 'QRobjArray')
  39.     except AttributeError:
  40.         QRobjArray = None
  41.  
  42.     try:
  43.         QRobjArray = getattr(sys.modules[__name__], 'QRobj')
  44.     except AttributeError:
  45.         QRobj = None
  46.  
  47.     return QRobj, QRobjArray
  48.  
  49.  
  50.  
  51. class QRobjArray:
  52.  
  53.     def __init__(self, qr_array=[]) -> QRobjArray:
  54.         self.qr_objects = self.serialize_objects(qr_array)
  55.  
  56.     @staticmethod
  57.     def serialize_objects(qr_array: list) -> list:
  58.         import sys
  59.         if not getattr(sys.modules[__name__], 'QRobj'):
  60.             raise ('Class QRobj must be defined in current namespace')
  61.  
  62.         qr_objects = []
  63.  
  64.         if qr_array and isinstance(qr_array, list):
  65.             for obj in qr_array:
  66.                 try:
  67.                     qr_objects.append(QRobj(obj['Quantity'], obj['Rate']))
  68.                 except (KeyError, AttributeError):
  69.                     raise Exception('Invalid data QR objects data format')
  70.  
  71.         return qr_objects
  72.  
  73.     def deserialize_objects(self) -> list:
  74.         if self.qr_objects:
  75.             return list(map(lambda obj: obj.to_dict(), self.sort_qr_objects(qr_objects)))
  76.         return []
  77.  
  78.     @staticmethod
  79.     def sort_qr_objects(qr_objects) -> QRobjArray:
  80.         return sorted(qr_objects, key=lambda obj: obj.r)
  81.    
  82.     def add(self, arr2: QRobjArray, mutable=False) -> QRobjArray:
  83.         arr1 = QRobjArray()
  84.         arr1.qr_objects = self.qr_objects
  85.        
  86.         for qr_obj1 in arr1:
  87.             for qr_obj2 in arr2:
  88.                 if qr_obj1 == qr_obj2:
  89.  
  90.                     if qr_obj2.is_null():
  91.                         arr1.remove(qr_obj1)
  92.                     qr_obj1 += qr_obj2
  93.                     arr2.remove(qr_obj2)
  94.  
  95.         if arr2:
  96.             for obj in arr2:
  97.                 arr1.append(obj)
  98.  
  99.         if mutable:
  100.             self.qr_objects = arr1.qr_objects
  101.         return self.sort_qr_objects(arr1)
  102.  
  103.     def remove(self, obj: QRobj) -> None:
  104.         self.qr_objects.remove(obj)
  105.  
  106.     def append(self, obj: QRobj) -> None:
  107.         self.qr_objects.append(obj)
  108.  
  109.     def __getitem__(self, index: int) -> QRobj:
  110.         return self.qr_objects[index]
  111.      
  112.     def __repr__(self) -> str:
  113.         return '%s' % self.qr_objects
  114.  
  115.  
  116. class QRobj:
  117.  
  118.     @staticmethod
  119.     def validate_attr(attr: any) -> float:
  120.         try:
  121.             return float(attr)
  122.         except ValueError:
  123.             raise Exception('Quantity and Rate must be in float or float-convertible type')
  124.  
  125.     def __init__(self, q: float, r:float) -> QRobj:
  126.         self.q = self.validate_attr(q)
  127.         self.r = self.validate_attr(r)
  128.  
  129.     def is_null(self) -> bool:
  130.         return self.q == 0
  131.  
  132.     def to_dict(self) -> dict:
  133.         return {'Quantity': self.q, 'Rate': self.r}
  134.  
  135.     def __add__(self, obj2: QRobj) -> QRobj:
  136.         if not obj2:
  137.             return self
  138.         self.q = obj2.q
  139.         return self
  140.  
  141.     def __eq__(self, obj2: QRobj) -> bool:
  142.         return self.r == obj2.r
  143.  
  144.     def __repr__(self) -> str:
  145.         return "{'Quantity': %s, 'Rate': %s}" % (self.q, self.r)
  146.  
  147.  
  148. if '__name__' == __main__:
  149.  
  150.     QRobjArray, QRobj = get_default_setup()
  151.  
  152.     qr_obj_array1 = QRobjArray(data)
  153.     qr_obj_array2 = QRobjArray(new_data_example)
  154.     qr_obj_array1.add(qr_obj_array2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement