By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,922 Members | 1,689 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,922 IT Pros & Developers. It's quick & easy.

map in Python

P: n/a
Stu
I have recently switched over to Python from Perl. I want to do
something like this in Python:

@test = ("a1", "a2", "a3");
map {s/[a-z]//g} @test;
print @test;

However, I take it there is no equivalent to $_ in Python. But in that
case how does map pass the elements of a sequence to a function? I
tried the following, but it doesn't work because the interpreter
complains about a missing third argument to re.sub.

import re
test = ["a1", "a2", "a3"]
map(re.sub("[a-z]", ""), test)
print test
Thanks in advance.

Regards,
Stuart <stuart AT zapata DOT org>

Jul 18 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On 21 Jan 2005 04:25:27 -0800, Stu <st****@zapata.org> wrote:
I have recently switched over to Python from Perl. I want to do
something like this in Python:

@test = ("a1", "a2", "a3");
map {s/[a-z]//g} @test;
print @test;

However, I take it there is no equivalent to $_ in Python. But in that
case how does map pass the elements of a sequence to a function? I
tried the following, but it doesn't work because the interpreter
complains about a missing third argument to re.sub.

import re
test = ["a1", "a2", "a3"]
map(re.sub("[a-z]", ""), test)
print test


This what you want?
import re
test = ["a1", "a2", "a3"]
test = [re.sub("[a-z]", "", item) for item in test]
test

['1', '2', '3']

--
Cheers,
Simon B,
si***@brunningonline.net,
http://www.brunningonline.net/simon/blog/
Jul 18 '05 #2

P: n/a
On Fri, 21 Jan 2005 12:37:46 +0000, Simon Brunning
<si************@gmail.com> wrote:
This what you want?
import re
test = ["a1", "a2", "a3"]
test = [re.sub("[a-z]", "", item) for item in test]
test ['1', '2', '3']


Or, if you *must* use map, you can do:
test = map(lambda item: re.sub("[a-z]", "", item), test)
test

['1', '2', '3']

I much prefer the first list comprehension form myself, but reasonable
men can differ...

--
Cheers,
Simon B,
si***@brunningonline.net,
http://www.brunningonline.net/simon/blog/
Jul 18 '05 #3

P: n/a
You have three ways to do what you want :

First wayt is to use lambda. Then, you want to write :
map(lambda x: re.sub("[a-z]", "", x), test)
Second is to use regular named function :
def remove_letters( s ): .... re.sub("[a-z]", "", s) map(remove_letters, test)
A third way would be to use the "pseudo-currying" described there :
http://www.python.org/moin/PythonDecoratorLibrary

In fact, you need a small generalisation :
class curried(object): .... def __init__(self, func, *a, **kw):
.... self.func = func
.... self.args = a
.... self.kwords = kw
.... def __call__(self, *a, **kw):
.... args = self.args + a
.... kwords = dict(self.kwords)
.... kwords.update(kw)
.... if len(args)+len(kwords) < self.func.func_code.co_argcount:
.... return curried(self.func, *args, **kwords)
.... else:
.... return self.func(*args, **kwords)

The difference is you can handle the kwords with that version !
Then you want to write this :
curried_sub = curried(re.sub)
map(curried_sub("[a-z]", "", count=0), test)

My opinion is : the simplest and best solution more "pythonic" is the
second one ! The third one is interesting but work only for functions
written in Python ! (Hopefully the re.sub function is written in
Python). The biggest problem with the first one is that lambda are
planned to disappear in future Python versions ...

Pierre

Stu a écrit : I have recently switched over to Python from Perl. I want to do
something like this in Python:

@test = ("a1", "a2", "a3");
map {s/[a-z]//g} @test;
print @test;

However, I take it there is no equivalent to $_ in Python. But in that
case how does map pass the elements of a sequence to a function? I
tried the following, but it doesn't work because the interpreter
complains about a missing third argument to re.sub.

import re
test = ["a1", "a2", "a3"]
map(re.sub("[a-z]", ""), test)
print test
Thanks in advance.

Regards,
Stuart <stuart AT zapata DOT org>

Jul 18 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.