Newbie question about tuples and list comprehensions

idiolect boingy.boingy at gmail.com
Wed Jun 25 19:36:20 EDT 2008


On Jun 25, 7:26 pm, Terry Reedy <tjre... at udel.edu> wrote:
> 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

A giant thank-you to all who've posted in response to my query - these
are all much better approaches to my problem.  I think I got hooked on
using a list comprehension as it seemed the most concise approach vs.
other techniques after a bunch of Google searches, but all of you have
pointed out more efficient methods.  I appreciate your willingness to
indulge a n00b who hasn't thought his problem through, apparently.
I'll try all of these approaches out over the next day and see what
works best, although I suspect you've all posted sufficient solutions.

Can't wait to try these suggestions out - cheers, idiolect



More information about the Python-list mailing list