Search code examples
pythonpython-3.xloopsmap-function

Convert a nested for loop to a map equivalent


Example:

for x in iterable1:
    expression

The map form would be:

map(lambda x: expression, iterable1)

How do I extend this to a nested for loop using only map and without list comprehensions?

Example:

for x in itr1:
    for y in itr2:
        expr

Solution

  • Bear with me on this one. Not an explanation but this worked after 2 days. Using only map and list. It's bad code. Suggestions to shorten the code are welcome. Python 3 solution

    Example using list comprehension:

    >>> a=[x+y for x in [0,1,2] for y in [100,200,300]]
    >>> a
    [100,200,300,101,201,301,102,202,302]
    

    Example using for:

    >>>a=[]
    >>>for x in [0,1,2]:
    ...    for y in [100,200,300]:
    ...        a.append(x+y)
    ...
    >>>a
    [100,200,300,101,201,301,102,202,302]
    

    Now example using only map:

    >>>n=[]
    >>>list(map(lambda x:n.extend(map(x,[100,200,300])),map(lambda x:lambda y:x+y,[0,1,2])))
    >>>n
    [100,200,300,101,201,301,102,202,302]
    

    Much smaller python2.7 solution:

    >>>m=[]
    >>>map(lambda x:m.extend(x),map(lambda x:map(x,[100,200,300]),map(lambda x:lambda y:x+y,[0,1,2])))
    >>>m
    [100,200,300,101,201,301,102,202,302]
    

    Another variation : I emailed to Mark Lutz and this was his solution. This doesn't use closures and is the closest to nested for loops functionality.

    >>> X = [0, 1, 2]               
    >>> Y = [100, 200, 300]
    >>> n = []
    >>> t = list(map(lambda x: list(map(lambda y: n.append(x + y), Y)),X))
    >>> n
    [100,200,300,101,201,301,102,202,302]