Something strange possessed Tim Chase and caused him to write: > def findClosest(dataset, target): [subtly *BUGGY* and overly verbose]
> def findClosest2(dataset, target): [evil] Try this (tested to the extent shown): C:\junk>type dict_closest.py def findClosest(dataset, target): [snip] def findClosest2(dataset, target): [snip] def findClosest3(dataset, target): closest_value = closest_key = closest_distance = None for k, v in dataset.items(): distance = (target - v) ** 2 # or use abs(target - v) if (closest_value is None or distance < closest_distance): closest_key = k closest_value = v closest_distance = distance return closest_key, closest_value if __name__ == '__main__': for testno, test in enumerate([ (4, {'a':1, 'b':3, 'c':6}), (0.1, {'a':0, 'b':3}), (0.1, {'a':3, 'b':0}), ]): target, data = test print for func in findClosest, findClosest2, findClosest3: k, v = func(data, target) print "test:%d func: %-13s -> %r %r" \ % (testno + 1, func.__name__, k, v) C:\junk>dict_closest.py test:1 func: findClosest -> 'b' 3 test:1 func: findClosest2 -> 'b' 3 test:1 func: findClosest3 -> 'b' 3 test:2 func: findClosest -> 'b' 3 <<<<<<======= test:2 func: findClosest2 -> 'a' 0 test:2 func: findClosest3 -> 'a' 0 test:3 func: findClosest -> 'b' 0 test:3 func: findClosest2 -> 'b' 0 test:3 func: findClosest3 -> 'b' 0 HTH, John -- http://mail.python.org/mailman/listinfo/python-list