'while' in list comprehension?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • jsaul

    'while' in list comprehension?

    Hi there,

    wouldn't it be useful to have a 'while' conditional in addition to
    'if' in list comprehensions?

    foo = []
    for i in bar:
    if len(i) == 0:
    break
    foo.append(i)

    would then turn into

    foo = [ i for i in bar while len(i)>0 ]

    Is there any reason for not having this kind of thing? I actually
    miss it pretty often.

    Cheers, jsaul
  • Emile van Sebille

    #2
    Re: 'while' in list comprehension?

    jsaul asks...[color=blue]
    > would then turn into
    >
    > foo = [ i for i in bar while len(i)>0 ]
    >
    > Is there any reason for not having this kind of thing? I actually
    > miss it pretty often.
    >[/color]


    How is this different from:

    foo = [ i for i in bar if len(i) ]

    Emile van Sebille
    emile@fenx.com


    Comment

    • Skip Montanaro

      #3
      Re: 'while' in list comprehension?

      [color=blue][color=green]
      >> foo = [ i for i in bar while len(i)>0 ][/color][/color]

      Emile> How is this different from:

      Emile> foo = [ i for i in bar if len(i) ]

      The first is like:

      _ = []
      for i in bar:
      if not (len(i) > 0):
      break
      _.append(i)
      return _

      The second is like:

      _ = []
      for i in bar:
      if len(i) > 0:
      _.append(i)
      return _

      Skip

      Comment

      • Jeff Epler

        #4
        Re: 'while' in list comprehension?

        Use 2.3's itertools:
        foo = [i for i in itertools.takew hile(lambda i: len(i) > 0, bar)]
        or maybe
        foo = list(itertools. takewhile(len, bar)]
        or even
        foo = itertools.takew hile(len, bar) # an iterable, not a list

        Jeff

        Comment

        • Bob Gailer

          #5
          Re: 'while' in list comprehension?

          At 01:05 PM 10/22/2003, Emile van Sebille wrote:
          [color=blue]
          >jsaul asks...[color=green]
          > > would then turn into
          > >
          > > foo = [ i for i in bar while len(i)>0 ]
          > >
          > > Is there any reason for not having this kind of thing? I actually
          > > miss it pretty often.
          > >[/color]
          >
          >
          >How is this different from:
          >
          > foo = [ i for i in bar if len(i) ][/color]

          My reading is that the comprehension would stop at the first i whose len
          were 0. e.g.
          foo = []
          for i in bar:
          if len(i) == 0:break
          foo.append(i)

          Bob Gailer
          bgailer@alum.rp i.edu
          303 442 2625


          ---
          Outgoing mail is certified Virus Free.
          Checked by AVG anti-virus system (http://www.grisoft.com).
          Version: 6.0.525 / Virus Database: 322 - Release Date: 10/9/2003

          Comment

          • Francis Avila

            #6
            Re: 'while' in list comprehension?

            "Emile van Sebille" <emile@fenx.com > wrote in message
            news:bn6k9i$tft t3$1@ID-11957.news.uni-berlin.de...[color=blue]
            > jsaul asks...[color=green]
            > > would then turn into
            > >
            > > foo = [ i for i in bar while len(i)>0 ]
            > >
            > > Is there any reason for not having this kind of thing? I actually
            > > miss it pretty often.
            > >[/color]
            >
            >
            > How is this different from:
            >
            > foo = [ i for i in bar if len(i) ]
            >
            > Emile van Sebille
            > emile@fenx.com
            >[/color]

            The idea is that 'while' stops iterating through the list when the condition
            isn't met. 'if' just doesn't output anything. e.g.:
            [color=blue][color=green][color=darkred]
            >>> bar = ['this', 'is', 'a', 'list', '', 'see?']
            >>> [i for i in bar if len(i)][/color][/color][/color]
            ['this', 'is', 'a', 'list', 'see?'][color=blue][color=green][color=darkred]
            >>> [i for i in bar while len(i)] # Pretend[/color][/color][/color]
            ['this', 'is', 'a', 'list']

            What's your typical use for this?

            I guess I see nothing really wrong with it, although I thought list
            comprehensions were supposed to make the iteration transparent--'while'
            kinda destroys the illusion. But these are the only two looping constructs
            that make sense in a list comprehension, so why not support both? OTOH,
            'while' makes no sense in a dictionary comprehension (and presumably we'll
            have those one day.)

            Comment

            • Hung Jung Lu

              #7
              Re: 'while' in list comprehension?

              jsaul <jsaul@gmx.de > wrote in message news:<200310221 75924.GA10716@j saul.de>...[color=blue]
              >
              > foo = [ i for i in bar while len(i)>0 ]
              >
              > Is there any reason for not having this kind of thing? I actually
              > miss it pretty often.[/color]

              Could you provide an example where you need it?

              From your message, it seems "bar" might be a list of strings. If so, you could use:

              foo = bar[:bar.index('')]

              regards,

              Hung Jung

              Comment

              • Terry Reedy

                #8
                Re: 'while' in list comprehension?


                "jsaul" <jsaul@gmx.de > wrote in message
                news:2003102217 5924.GA10716@js aul.de...[color=blue]
                > Hi there,
                >
                > wouldn't it be useful to have a 'while' conditional in addition to
                > 'if' in list comprehensions?
                >
                > foo = []
                > for i in bar:
                > if len(i) == 0:
                > break
                > foo.append(i)
                >
                > would then turn into
                >
                > foo = [ i for i in bar while len(i)>0 ][/color]

                while is simply not same as if: break!
                if executes once for each value of i, while indefinitely.
                If you translate back by current rule, which will not change, you get:

                foo = []
                for i in bar:
                while len(i) >0:
                foo.append(i)

                Terry J. Reedy


                Comment

                • Stephen Horne

                  #9
                  Re: 'while' in list comprehension?

                  On Wed, 22 Oct 2003 22:57:42 -0400, "Terry Reedy" <tjreedy@udel.e du>
                  wrote:
                  [color=blue]
                  >while is simply not same as if: break!
                  >if executes once for each value of i, while indefinitely.
                  >If you translate back by current rule, which will not change, you get:
                  >[/color]

                  'while' is an English word which has meaning independant of the
                  existing Python 'while' loop. It is not necessarily wrong to apply a
                  different aspect of that meaning in a list comprehension.

                  Besides, I read the syntax as equating to...

                  foo = []
                  for i in bar while len(i) >0:
                  foo.append(i)

                  Yes, I know that isn't a legal Python loop. My point is that it didn't
                  look like a nested loop to me, but rather like an additional qualifier
                  on the existing loop.

                  That said, you do have a point - multiple 'for' parts in a list
                  comprehension act as nested loops, so maybe a while part should too.

                  The trouble is that a standalone while loop probably makes little
                  sense in a list comprehension - sure you have a place to put the loop
                  condition, but what about the initialisation and body?

                  If there were a real while-part in a list comprehension, it would
                  probably need those things to become explicit (becoming a lot like the
                  C for loop) - something like...

                  [k while k=1; k<1024; k*=2]

                  Hmmmm...

                  while i=0; i<10; i++ :
                  print i

                  Hmmmm....

                  Nah - damn silly idea.


                  --
                  Steve Horne

                  steve at ninereeds dot fsnet dot co dot uk

                  Comment

                  • jsaul

                    #10
                    Re: 'while' in list comprehension?

                    * Terry Reedy [2003-10-23 04:57]:[color=blue]
                    > "jsaul" <jsaul@gmx.de > wrote in message
                    > news:2003102217 5924.GA10716@js aul.de...[color=green]
                    > > wouldn't it be useful to have a 'while' conditional in addition to
                    > > 'if' in list comprehensions?
                    > >
                    > > foo = []
                    > > for i in bar:
                    > > if len(i) == 0:
                    > > break
                    > > foo.append(i)
                    > >
                    > > would then turn into
                    > >
                    > > foo = [ i for i in bar while len(i)>0 ][/color]
                    >
                    > while is simply not same as if: break!
                    > if executes once for each value of i, while indefinitely.
                    > If you translate back by current rule, which will not change, you get:
                    >
                    > foo = []
                    > for i in bar:
                    > while len(i) >0:
                    > foo.append(i)[/color]

                    I agree that 'while' cannot not just be considered a replacement
                    for 'if'. However, adding a 'while' conditional to list
                    comprehensions would very unlikely be misunderstood as another
                    (infinite) loop. Instead, I find the above 'while' example about
                    as intuitive as is the case with 'if'. It simply means that under
                    a certain condition the loop will be ended, which is just what
                    most people would probably expect.

                    Anyway, thanks a lot to all who replied! What is your opinion
                    after this discussion, write a PEP or just forget about it?

                    Cheers, jsaul

                    Comment

                    • Michael Geary

                      #11
                      Re: 'while' in list comprehension?

                      > > > wouldn't it be useful to have a 'while' conditional in addition to[color=blue][color=green][color=darkred]
                      > > > 'if' in list comprehensions?
                      > > >
                      > > > foo = []
                      > > > for i in bar:
                      > > > if len(i) == 0:
                      > > > break
                      > > > foo.append(i)
                      > > >
                      > > > would then turn into
                      > > >
                      > > > foo = [ i for i in bar while len(i)>0 ][/color]
                      > >
                      > > while is simply not same as if: break!
                      > > if executes once for each value of i, while indefinitely.
                      > > If you translate back by current rule, which will not change, you get:
                      > >
                      > > foo = []
                      > > for i in bar:
                      > > while len(i) >0:
                      > > foo.append(i)[/color]
                      >
                      > I agree that 'while' cannot not just be considered a replacement
                      > for 'if'. However, adding a 'while' conditional to list
                      > comprehensions would very unlikely be misunderstood as another
                      > (infinite) loop. Instead, I find the above 'while' example about
                      > as intuitive as is the case with 'if'. It simply means that under
                      > a certain condition the loop will be ended, which is just what
                      > most people would probably expect.[/color]

                      Here's an idea that might avoid this bit of confusion:

                      foo = [ i for i in bar until len(i) == 0 ]

                      That also makes the conditional test the same as used in the "if/break"
                      form.

                      Hmm... Would this mean that "until" would have to become a reserved word?
                      Maybe not such a good idea if that's the case.

                      -Mike


                      Comment

                      • Andrae Muys

                        #12
                        Re: 'while' in list comprehension?

                        Jeff Epler <jepler@unpytho nic.net> wrote in message news:<mailman.3 4.1066855592.70 2.python-list@python.org >...[color=blue]
                        > Use 2.3's itertools:
                        > foo = [i for i in itertools.takew hile(lambda i: len(i) > 0, bar)]
                        > or maybe
                        > foo = list(itertools. takewhile(len, bar)]
                        > or even
                        > foo = itertools.takew hile(len, bar) # an iterable, not a list
                        >[/color]

                        or list(takewhile( len, bar))

                        from itertools import * :)

                        Andrae

                        Comment

                        • Hannu Kankaanp??

                          #13
                          Re: 'while' in list comprehension?

                          "Michael Geary" <Mike@DeleteThi s.Geary.com> wrote in message news:<vpii6tiq1 rhja3@corp.supe rnews.com>...[color=blue]
                          > Here's an idea that might avoid this bit of confusion:
                          >
                          > foo = [ i for i in bar until len(i) == 0 ][/color]

                          Another variation:

                          foo = [i for i in bar, break if len(i) == 0]

                          This wouldn't need a new keyword.

                          Comment

                          • Greg Ewing (using news.cis.dfn.de)

                            #14
                            Re: 'while' in list comprehension?

                            Hannu Kankaanp?? wrote:[color=blue]
                            > Another variation:
                            >
                            > foo = [i for i in bar, break if len(i) == 0]
                            >
                            > This wouldn't need a new keyword.[/color]

                            My thoughts on all this are that if you want to do
                            something that procedural, it would be better written
                            out as nested statements. List comprehensions are
                            meant to be read declaratively.

                            --
                            Greg Ewing, Computer Science Dept,
                            University of Canterbury,
                            Christchurch, New Zealand


                            Comment

                            • Alex Martelli

                              #15
                              Re: 'while' in list comprehension?

                              Greg Ewing (using news.cis.dfn.de ) wrote:
                              [color=blue]
                              > Hannu Kankaanp?? wrote:[color=green]
                              >> Another variation:
                              >>
                              >> foo = [i for i in bar, break if len(i) == 0]
                              >>
                              >> This wouldn't need a new keyword.[/color]
                              >
                              > My thoughts on all this are that if you want to do
                              > something that procedural, it would be better written
                              > out as nested statements. List comprehensions are
                              > meant to be read declaratively.[/color]

                              Yes, they are. Still,

                              [ i for i in bar while len(i) ]

                              DOES read pretty declaratively to me (while the "break"
                              version admittedly doesn't).


                              Alex

                              Comment

                              Working...