[Tutor] Writing the Map function as a oneliner
Rafael Turner
steven.rafael.turner at gmail.com
Tue Nov 8 00:32:23 CET 2011
Hello,
I am trying to write the map function as a oneliner. I currently have
implement map as a list comprehension:
map = lambda F,li: [F(x) for x in li]
But I would like to make recursive version. Here is what I was thinking:
I can write map as
def pyMap(F,li):
if li == []:
return []
else:
return [F(li[0])] + map2(F, li[1:])
I can logical encode an if-then-else structure as follows:
Let Q be the result of the following IF,THEN, ELSE conditional structure:
If(S):
Then: A
Else: B
We can implement this only using logical constructors.
Q = (A AND S) OR (B AND NOT S)
where:
S is the input for the If condition,
A is the input to Then subexpression
B is the input for the Else subexpression
Q is the output of the entire If-Then-Else expression.
So, I tried:
def pyMap2(F, li):
def ifFun(P,eq): return li == []
return ([] and ifFun(li,[])) or ([F(li[0])] + pyMap2(F, li[1:]) and not [])
But it's no use. pyMap works fine but pyMap2 does not.
I saved the above code as map.py and ran it in the interpreter.
>>> import map
>>> map.pyMap2(lambda x: x + 2, [1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "map.py", line 15, in pyMap2
return ([] and fIF(li,[])) or ([F(li[0])] + pyMap2(F, li[1:]) and not [])
File "map.py", line 15, in pyMap2
return ([] and fIF(li,[])) or ([F(li[0])] + pyMap2(F, li[1:]) and not [])
File "map.py", line 15, in pyMap2
return ([] and fIF(li,[])) or ([F(li[0])] + pyMap2(F, li[1:]) and not [])
File "map.py", line 15, in pyMap2
return ([] and fIF(li,[])) or ([F(li[0])] + pyMap2(F, li[1:]) and not [])
IndexError: list index out of range
Thank you for your help,
Rafael
More information about the Tutor
mailing list