On Jun 26, 7:37 am, idiolect <[EMAIL PROTECTED]> 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] -- http://mail.python.org/mailman/listinfo/python-list