Newbie question about tuples and list comprehensions

Terry Reedy tjreedy at udel.edu
Wed Jun 25 19:26:00 EDT 2008



idiolect 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:

Why are you trying to do this with a list comprehension?  Learn the 
basics first.  Perhaps you have read too many of the recent threads 
presenting diverting challenges for bored experienced programmers.  Some 
of these were definitely not Pythonic code for real use.

First question: do you really want to create a new 'very long list' or 
modify list 'data' in place.  Let's assume the latter.

for i,tup in enumerate(data):
     data[i] = replace(tup)

where replace(tup) is an expression or function that produces a tuple 
meeting your criteria.  Simplest is
(max(tup[0],Rthresh), max(tup[1],Gthresh), max(tup[2],Bthresh)).

If nearly all your pixels are ok, add the following before the 
assignment so you only make replacements when actually needed:
if tup[0] < Rthresh or tup[1] < Gthresh or tup[2] < Bthresh:

Terry Jan Reedy





More information about the Python-list mailing list