Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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}]
- new_data_example = [{"Quantity":0,"Rate":0.01136095},{"Quantity":0.0005,"Rate":0.01135600},{"Quantity":0.0015,"Rate":0.09}]
- def update_data(new_data=new_data_example, old_data=data):
- for i, old_obj in enumerate(old_data):
- for idx, new_obj in enumerate(new_data):
- if old_obj.get('Rate') == new_obj.get('Rate'):
- if new_obj.get('Quantity') == 0:
- old_data.pop(i)
- else:
- old_obj['Quantity'] = new_obj.get('Quantity')
- new_data.pop(idx)
- if new_data:
- for obj in new_data:
- old_data.append(obj)
- return sorted(old_data, key=lambda obj: obj.get('Rate'))
- return old_data
- update_data(new_data=new_data_example, old_data=data)
- #############################
- In OOP
- #############################
- def get_default_setup():
- import sys
- try:
- QRobjArray = getattr(sys.modules[__name__], 'QRobjArray')
- except AttributeError:
- QRobjArray = None
- try:
- QRobjArray = getattr(sys.modules[__name__], 'QRobj')
- except AttributeError:
- QRobj = None
- return QRobj, QRobjArray
- class QRobjArray:
- def __init__(self, qr_array=[]) -> QRobjArray:
- self.qr_objects = self.serialize_objects(qr_array)
- @staticmethod
- def serialize_objects(qr_array: list) -> list:
- import sys
- if not getattr(sys.modules[__name__], 'QRobj'):
- raise ('Class QRobj must be defined in current namespace')
- qr_objects = []
- if qr_array and isinstance(qr_array, list):
- for obj in qr_array:
- try:
- qr_objects.append(QRobj(obj['Quantity'], obj['Rate']))
- except (KeyError, AttributeError):
- raise Exception('Invalid data QR objects data format')
- return qr_objects
- def deserialize_objects(self) -> list:
- if self.qr_objects:
- return list(map(lambda obj: obj.to_dict(), self.sort_qr_objects(qr_objects)))
- return []
- @staticmethod
- def sort_qr_objects(qr_objects) -> QRobjArray:
- return sorted(qr_objects, key=lambda obj: obj.r)
- def add(self, arr2: QRobjArray, mutable=False) -> QRobjArray:
- arr1 = QRobjArray()
- arr1.qr_objects = self.qr_objects
- for qr_obj1 in arr1:
- for qr_obj2 in arr2:
- if qr_obj1 == qr_obj2:
- if qr_obj2.is_null():
- arr1.remove(qr_obj1)
- qr_obj1 += qr_obj2
- arr2.remove(qr_obj2)
- if arr2:
- for obj in arr2:
- arr1.append(obj)
- if mutable:
- self.qr_objects = arr1.qr_objects
- return self.sort_qr_objects(arr1)
- def remove(self, obj: QRobj) -> None:
- self.qr_objects.remove(obj)
- def append(self, obj: QRobj) -> None:
- self.qr_objects.append(obj)
- def __getitem__(self, index: int) -> QRobj:
- return self.qr_objects[index]
- def __repr__(self) -> str:
- return '%s' % self.qr_objects
- class QRobj:
- @staticmethod
- def validate_attr(attr: any) -> float:
- try:
- return float(attr)
- except ValueError:
- raise Exception('Quantity and Rate must be in float or float-convertible type')
- def __init__(self, q: float, r:float) -> QRobj:
- self.q = self.validate_attr(q)
- self.r = self.validate_attr(r)
- def is_null(self) -> bool:
- return self.q == 0
- def to_dict(self) -> dict:
- return {'Quantity': self.q, 'Rate': self.r}
- def __add__(self, obj2: QRobj) -> QRobj:
- if not obj2:
- return self
- self.q = obj2.q
- return self
- def __eq__(self, obj2: QRobj) -> bool:
- return self.r == obj2.r
- def __repr__(self) -> str:
- return "{'Quantity': %s, 'Rate': %s}" % (self.q, self.r)
- if '__name__' == __main__:
- QRobjArray, QRobj = get_default_setup()
- qr_obj_array1 = QRobjArray(data)
- qr_obj_array2 = QRobjArray(new_data_example)
- qr_obj_array1.add(qr_obj_array2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement