Simple - looking for a way to do an element exists check..

thebjorn BjornSteinarFjeldPettersen at gmail.com
Sat Feb 23 20:19:47 EST 2008


On Feb 23, 6:18 pm, Paul Hankin <paul.han... at gmail.com> wrote:
> On Feb 22, 7:01 pm, Paul McGuire <pt... at austin.rr.com> wrote:
>
> > On Feb 22, 12:54 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:
>
> > > Paul Rubin <http://phr...@NOSPAM.invalid> writes:
> > > >     if any(x==element[0] for x in a):
> > > >       a.append(element)
>
> > > Should say:
>
> > >      if any(x[0]==element[0] for x in a):
> > >         a.append(element)
>
> > I think you have this backwards.  Should be:
>
> >      if not any(x[0]==element[0] for x in a):
> >         a.append(element)
>
> IMO Jason's solution of testing containment in a generator is better
> (more readable).
>     if element[0] not in (x[0] for x in a):
>         a.append(element)
>
> --
> Paul Hankin

It may be more readable (although that's debatable), but it always
traverses the entire list.

If the list is short I'd use either the traditional "for/else" or the
newer "if all(...)":

    if all(x[0] != element[0] for x in a):
        a.append(element)

which allows for short-circuit evaluation -- I generally try to stay
away from negating any() and all() because the logic often gets
convoluted.

If the lists are long enough to care, either rewrite use a set-based
solution if the items are hashable, or keep the elements sorted and
rewrite to use the bisect module if the elements can be ordered.

-- bjorn



More information about the Python-list mailing list