2013-06-26 1 views
4

У меня есть строка, которая вытягивает переменные из нескольких списков, и я хочу, чтобы она избегала ошибки StopIteration, которая появляется, чтобы она могла перейти на следующую строку. В настоящий момент я использую функцию break, это позволяет избежать StopIteration, но дает мне только первый элемент в списке и оставляет после него пустую строку, если я должен ее распечатать.Как избежать ошибки StopIteration в python

Вот две из моих итераций, которые имеют ту же проблему.

def compose_line5(self, synset_offset, pointer_list): 
     self.line5 = '''''' 
     for item in pointer_list: 
      self.line5 += '''http://www.example.org/lexicon#'''+synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+pointer_list.next()+'''\n'''    
      break 
     return self.line5 

    def compose_line6(self, pointer_list, synset_list): 
     self.line6 = '''''' 
     for item in synset_list: 
      self.line6 += '''http://www.example.org/lexicon#'''+pointer_list.next()+''' http://www.monnetproject.eu/lemon#pos '''+synset_list.next()+'''\n'''      
      break 
     return self.line6 

Это ошибка я получаю без перерыва:

Traceback (most recent call last): 
    File "wordnet.py", line 225, in <module> 
    wordnet.line_for_loop(my_file) 
    File "wordnet.py", line 62, in line_for_loop 
    self.compose_line5(self.synset_offset, self.pointer_list) 
    File "wordnet.py", line 186, in compose_line5 
    self.line5 += '''http://www.example.org/lexicon#'''+self.synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+self.pointer_list.next()+'''\n''' 
StopIteration 

Есть быстрое решение для этого, или я должен перехватывать исключения для каждого метода я использую ИТЭР() в?

+1

Почему вы вызываете self.pointer_list.next() и передаете в pointer_list? – doctorlove

+0

К сожалению, Типо! не имеет никакого значения! – Johnnerz

+2

Здесь нет необходимости в тройной цитате; вы не включаете разрывы строк, а цитирование слишком многословно. Еще лучше используйте форматирование строк: 'http://www.example.org/lexicon# {} http://www.monnetproject.eu/lemon#has_ptr{}\n'.format(synset_offset, pointer_list.next ()) '. –

ответ

3

В compose_line5 вместо pointer_list.next() используйте элемент - вы уже итерируете по указателю_list.

Для compose_line6, похоже, вы хотите перебирать два списка одновременно. Используйте верхний ответ от Is there a better way to iterate over two lists, getting one element from each list for each iteration? (я предполагаю, что оба список имеет одинаковую длину)

Да, протокол итератора поднимет StopIteration (не ошибка, просто исключение сигнализации конца итерации), если вы звоните. next() на нем вручную. Пифический способ использовать его - использовать его как обычный итератор (например, перебирать его), а не вызывать на нем .next().

Ваш код имеет несколько проблем, помимо того что вы можете захотеть взглянуть на - посмотреть на http://www.python.org/dev/peps/pep-0008/

Например, нет необходимости использовать «» «» «», когда «» суффиксов. Вместо того, чтобы делать + =, вы можете создать список, а затем присоединиться к концу. Не уверен, почему вы храните вещи в себе, если вы просто возвращаете их из функции.

+0

Хорошо, что работает для line5, но для строки6 я просто использую 'для элемента в synset_list:' для цикла в течение этого количества раз, два списка, которые я использую, имеют одинаковую длину Редактировать: просто увидели, что вы редактировали там, благодаря!! – Johnnerz

+0

В вашем примере кода для 6 используются как pointer_list, так и synset_list. Если вам действительно не нужно что-либо использовать в synset_list, почему бы просто не перебрать указатель на pointer_list? –

+0

Жаль, что я ошибся, когда сказал, что – Johnnerz