def compareIterables(iter1, iter2): """ Compares two iterables. Considered equal if different lengths but one iterable is filled with NaN or None. :param Iterable iter1: iterable possibly with None values :param Iterable iter2: iterable possibly with None values :return: True if equivalent; otherwise false """ def makeList(val): result = cell_types.makeIterable(val) pruned_result = pruneNulls(result) if isinstance(pruned_result, list): return pruned_result else: return [v for v in pruned_result] # Make sure the inputs are iterables iter1 = makeList(iter1) iter2 = makeList(iter2) if len(iter1) != len(iter2): return False pairs = zip(iter1, iter2) try: if cell_types.isFloats(iter1): return all([cell_types.isEquivalentFloats(i1, i2) for i1, i2 in pairs]) except TypeError as err: return False return all([i1 == i2 for i1, i2 in pairs])
def testIsEquivalentFloats(self): self.assertFalse(cell_types.isEquivalentFloats(1, 2)) self.assertTrue(cell_types.isEquivalentFloats(1.0, 1.0)) self.assertFalse(cell_types.isEquivalentFloats(1.0, 2.0)) self.assertTrue(cell_types.isEquivalentFloats(1, 1)) self.assertFalse(cell_types.isEquivalentFloats(1, 1.0001)) self.assertFalse(cell_types.isEquivalentFloats(1, np.nan)) self.assertTrue(cell_types.isEquivalentFloats(np.nan, np.nan))