Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

for loops in python

Tags:

python

Is there a pythonic way (I know I can loop using range(len(..)) and get an index) to do the following example:

for line in list_of_strings:
    if line[0] == '$':
        while line[-1] == '#':
            # read in the Next line and do stuff
        # after quitting out of the while loop, the next iteration of the for loop
        # should not get any of the lines that the while loop already dealt with

essentially, the nested while loop should be incrementing the for loop.

Edit: Not a file handle, confused two things I was working on, it's a list of strings

like image 645
pseudosudo Avatar asked Jul 26 '11 17:07

pseudosudo


2 Answers

One of the most basic challenges in python is getting clever when iterating over lists and dicts. If you actually need to modify the collection while iterating, you may need to work on a copy, or store changes to apply at the end of iteration.

In your case, though, you just need to skip items in the list. You can probably manage this by expanding iteration into an more explicit form.

i = iter(list_of_strings)
for line in i:
    if line.startswith('$'):
        while line.endswith('#'):
            line = i.next()
        # do work on 'line' which begins with $ and doesn't end with #

and that's all you really need to do.

Edit: As kindall mentions, if the while portion may iterate past the end of the input sequence, you'll need to do a bit more. You can do the following.

i = iter(list_of_strings)
for line in i:
    if line[0] == '$':
        try:
            while line[-1] == '#':
                line = i.next()
        except StopIteration:
            break
        # do work on 'line' which begins with $ and doesn't end with #
like image 195
SingleNegationElimination Avatar answered Sep 24 '22 22:09

SingleNegationElimination


As long as file is a file handle you can do this instead of using readlines():

for line in fh:
  if line[0] == '$':
    while line[-1] == '#':
      line = next(fh)

File handles are iterable, and the next() function retrieves the next value from an iterable.

like image 31
g.d.d.c Avatar answered Sep 25 '22 22:09

g.d.d.c