File: map-nesting-example.py

#!/usr/bin/python
"""
========================================================================
Nested loops via map()/lambda, comprehension, and statements.
This code runs in Python 3.X and 2.X, and was a reply to a reader email.

Given: 
     x=[0, 1, 2], y=[100, 200, 300]
Output: 
     [100, 200, 300, 101, 201, 301, 102, 202, 302]
========================================================================
"""
from __future__ import print_function           # for print() in 2.X
import sys
if sys.version[0] == '2': list = lambda x: x    # list() moot in 2.X
print(sys.version.split()[0])


#-----------------------------------------------------------------------
# 1) original, from reader's email
#-----------------------------------------------------------------------

x=[0,1,2]
y=[100,200,300]
fn=lambda x:lambda y:x+y
n=[] #empty list to accumulate result
list(map(lambda x:n.extend(map(x,y)),map(fn,x)))
print(n)


#-----------------------------------------------------------------------
# 2) original, edited a bit for readability - whitespace, etc.
#-----------------------------------------------------------------------

x = [0, 1, 2]
y = [100, 200, 300]

fn = lambda x: lambda y: x + y 

n = [] 

list(    
    map( 
        lambda x: n.extend(map(x,  y)),  
        map(fn, x)
    )   
)

print(n)


#-----------------------------------------------------------------------
# 3) original, with operations decomposed for clarity
#-----------------------------------------------------------------------

X = [0, 1, 2]
Y = [100, 200, 300]

def fn(x):
    def fm(y):
        return x + y        # a closure: remembers "x", expects "y"
    return fm
 
temp = map(fn, X)           # functions, each with a saved "x" value

n = []
for ft in temp:             # for each of the closure functions:
   sums = map(ft, Y)        # apply function ft (with one "x") to each y
   n.extend(sums)

print(n)


#-----------------------------------------------------------------------
# 4) a simpler (simplest?) alternative: nested loop comprehension
#-----------------------------------------------------------------------

X = [0, 1, 2]
Y = [100, 200, 300]

sums = [x + y for x in X for y in Y]
print(sums)


#-----------------------------------------------------------------------
# 5) equivalent to #4, but with full statements (may be slower?)
#-----------------------------------------------------------------------

X = [0, 1, 2]               
Y = [100, 200, 300]

sums = []
for x in X:
    for y in Y:
        sums.append(x + y)

print(sums)


#-----------------------------------------------------------------------
# 6) nested map+lambda loops and append (nesting similar to statements)
#-----------------------------------------------------------------------

X = [0, 1, 2]               
Y = [100, 200, 300]
                         
n = []
t = list(map(lambda x: list(map(lambda y: n.append(x + y), Y)), X))
print(n)


#-----------------------------------------------------------------------
# 7) mapping sum() over items paired with a nested-loop comprehension
#-----------------------------------------------------------------------

X = [0, 1, 2]               
Y = [100, 200, 300]

print( list(map(sum, [(x, y) for x in X for y in Y])) )



[Home] Books Programs Blog Python Author Training Search Email ©M.Lutz