On Fri, 11 Mar 2011 13:00:23 -0800, Patrick wrote: > Hi, > > The build-in map functions looks quite nice but it requests the > iterables to be of the same length or otherwises will file with None > (most of time fails the function). Just wondering if there are already > enhancement work done with it?
That has been fixed in Python 3.1: >>> from operator import add >>> list(map(add, [1,2,3], [1,2,3,4,5])) [2, 4, 6] Starting from Python 2.3, the itertools module has had a function imap with the same behaviour: >>> from operator import add >>> list(itertools.imap(add, [1,2,3], [1,2,3,4,5])) [2, 4, 6] > I did some simple code but it will handle list without nesting only. Surely that is a good thing. If you have a mix of nested and non-nested data, that tells me your data is badly organized and needs to be fixed. > I am looking for examples that could hand input of "a = [2,3], b=4" Using a small helper function: import itertools def make_iterable(obj): try: iter(obj) except TypeError: obj = itertools.cycle([obj]) return obj def enhanced_map(func, *args): args = map(make_iterable, args) return list(itertools.imap(func, *args)) WARNING: this is dangerous. If none of the arguments are iterable, e.g. you call enhanced_map(operator.add, 2, 3), this will happily loop forever building a larger and larger list, until you run out of memory or kill the Python process. > and "a=[1,[2,3],4], b=[5,[6,7,8],9,10]". That means if the nesting > structure is the same, enhanced map function will automatically extend > the shorter list using the last element. It isn't clear what you want here. Are you expecting this enhanced map to recursively drop down into each layer of sub-sequences? That is: enhanced_map([1, [2,3, [4,5], 6], 7], [8, [7,6, [5,4], 3], 2]) should be the same as map([1, 2, 3, 4, 5, 6, 7], [8, 7, 6, 5, 4, 3, 2]) or something different? What do you expect to happen if the sub-sequences don't match up exactly? E.g. a = [1, 2, [3, 4]]; b = [1, [2, 3], 4] What do you expect to happen if the shorter list is empty? E.g. a = [1, 2, [3, 4], 5]; b = [1, 2, [], 3] This will get really messy fast. My advice is to forget about this as a bad idea, and instead concentrate on making sure your data isn't so badly arranged in the first place. -- Steven -- http://mail.python.org/mailman/listinfo/python-list