Newbie question about tuples and list comprehensions

John Machin sjmachin at lexicon.net
Wed Jun 25 19:02:52 EDT 2008


On Jun 26, 7:37 am, idiolect <boingy.boi... at gmail.com> wrote:
> Hi all - Sorry to plague you with another newbie question from a
> lurker.  Hopefully, this will be simple.
>
> I have a list full of RGB pixel values read from an image.  I want to
> test each RGB band value per pixel, and set it to something else if it
> meets or falls below a certain threshold - i.e., a Red value of 0
> would be changed to 50.
>
> I've built my list by using a Python Image Library statement akin to
> the following:
>
> data = list(image.getdata())
>
> Which produces a very long list that looks like [(0,150,175),
> (50,175,225),...].  I'm trying to figure out a fast and pythonic way
> to perform my operation.  The closest I've come so far to a succinct
> statement is a list comprehension along the syntax of:
>
> source = [((x,y,z),(x+50,y+50,z+50))[bool(x or y or z < 50)] for
> (x,y,z) in source]
>
> ...which kind of approaches the effect I'm looking for, but it doesn't
> really test and change each value in the tuple individually.  My
> understanding of the things you can do with lists and python in
> general is rather naive, so I would appreciate any insight anyone can
> offer since I am not sure if I'm even headed down the correct path
> with list comprehensions.
>

"x or y or z < 50" doesn't do what you think it does:
>>> x, y, z = 120, 130, 140
>>> x or y or z < 50
120
>>> ((x or y) or z) < 50
False
>>> x or (y or (z < 50))
120
>>>

Here's one approach (requires Python 2.5 or later):
[(50 if x < 50 else x, 50 if y < 50 else y, 50 if z < 50 else z) for
(x, y, z) in source]



More information about the Python-list mailing list