индексировать список в цикле Python for - PullRequest
1 голос
/ 24 июня 2010

Я делаю цикл for внутри цикла for.Я перебираю список и нахожу определенную строку, которая содержит шаблон регулярного выражения.Как только я нахожу строку, мне нужно искать, чтобы найти следующую строку определенного шаблона.Мне нужно хранить обе строки, чтобы иметь возможность анализировать время для них.Я создал счетчик для отслеживания порядкового номера списка, как работает внешний цикл for.Могу ли я использовать такую ​​конструкцию, чтобы найти вторую нужную мне строку?

 index = 0
 for lineString in summaryList:  
    match10secExp = re.search('taking 10 sec. exposure', lineString)
    if match10secExp:
       startPlate = lineString
       for line in summaryList[index:index+10]:
           matchExposure = re.search('taking \d\d\d sec. exposure', line)
           if matchExposure:
               endPlate = line
           break
    index = index + 1

Код работает, но я не получаю нужный мне результат.

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 июня 2010

В зависимости от ваших конкретных потребностей, вы можете просто использовать итератор в списке или два из них как mae по itertools.tee .То есть, если вы хотите искать строки, следующие за первым шаблоном только для второго шаблона, один итератор сделает:

theiter = iter(thelist)

for aline in theiter:
  if re.search(somestart, aline):
    for another in theiter:
      if re.search(someend, another):
        yield aline, another  # or print, whatever
        break

Это будет не строк поискаот aline до окончания another для somestart, только для someend.Если вам нужно искать их для обеих целей, т. Е. Оставить theiter без изменений для внешнего цикла, вот где tee может помочь:

for aline in theiter:
  if re.search(somestart, aline):
    _, anotheriter = itertools.tee(iter(thelist))
    for another in anotheriter:
      if re.search(someend, another):
        yield aline, another  # or print, whatever
        break

Это исключение из общего правила о tee, которые дают документы:

После того, как tee() произвел разделение, исходная итерация не должна использоваться где-либо еще;в противном случае итерация может быть продвинута без информирования объектов-тройников.

, поскольку продвижение theiter и anotheriter происходит в непересекающихся частях кода, а anotheriter всегдаперестраивается заново, когда это необходимо (поэтому повышение на theiter пока не имеет значения).

1 голос
/ 24 июня 2010
matchExposure = re.search('taking \d\d\d sec. exposure', lineString)

должно быть

matchExposure = re.search('taking \d\d\d sec. exposure', line)
...