[Tutor] map, filter and lambda functions

Allan Crooks allan.crooks@btinternet.com
Thu, 23 Aug 2001 01:01:58 +0100


On 22 Aug 2001, at 16:16, Sheila King wrote:

> Here's the new, shorter version:
> 
> checklist = string.split(filetext, "\n")
> checklist = filter(lambda x: x != '', checklist)
> checklist = map(lambda x: string.strip(x), checklist)
> checklist = map(lambda x: string.upper(x), checklist)
> 
> The thing is, I can't use list comprehensions in this script, since my
> webhost is only running Python 1.5.2. Given this restriction, is my
> second version the best (most efficient) way of handling such a code
> block?

My opinion is, the best version is the one which makes you smile 
more. :) Out of the two, I like the second one more.

> Is there a way to do this without lambda functions, or are they
> pretty much needed in this case?

You don't need to put lambda functions, you can just provide 
string.strip and string.upper without using lambda what-so-ever.

I would personally, however, write this:

checklist = map (lambda x: x.strip().upper(), checklist)

or, if Python 1.5.2 doesn't like that:

checklist = map (lambda x: string.upper(string.strip(x)), checklist)

Which reduces it down to one line. But you might not want that.

You could also replace the lambda function that's used in filter with 
"None". IIRC, that will only return objects which have a positive 
truth value (in the case of strings, this would only be non-empty 
strings).

If you were really daring, you could put all that into one large 
function:

checklist = map (string.upper, map (string.strip, filter (None, 
string.split(filetext, "\n"))))

That *might* work, I can't be bothered to test it. :)

Use whatever version you are happiest with. I'd go with whatever 
version is easier to understand when you read it, which, out of the 
two you've given us, would be the second one.

Allan.