Повредите вложенный (двойной) цикл в Python [дубликат]

38
задан Peter Mortensen 29 December 2010 в 10:17
поделиться

3 ответа

Вероятно, это не то, на что вы надеетесь, но обычно вам нужно иметь перерыв после установки find на True

for word1 in buf1: 
    find = False 
    for word2 in buf2: 
        ... 
        if res == res1: 
            print "BINGO " + word1 + ":" + word2 
            find = True 
            break             # <-- break here too
    if find: 
        break 

Другой способ - использовать генератор выражение для сжатия for в один цикл

for word1, word2 in ((w1, w2) for w1 in buf1 for w2 in buf2):
    ... 
    if res == res1: 
        print "BINGO " + word1 + ":" + word2
        break 

Вы также можете рассмотреть возможность использования itertools.product

from itertools import product
for word1, word2 in product(buf1, buf2):
    ... 
    if res == res1: 
        print "BINGO " + word1 + ":" + word2
        break 
45
ответ дан 27 November 2019 в 03:14
поделиться

Рефакторинг с использованием функций, чтобы вы могли вернуться, когда найдете свое «бинго».

Предложение разрешить явное прерывание вложенных циклов было отклонено: http://www.python.org/dev/peps/pep-3136/

7
ответ дан 27 November 2019 в 03:14
поделиться

В большинстве случаев вы можете использовать несколько методы для создания одиночного цикла, который делает то же самое, что и двойной цикл.

В вашем примере вы можете использовать itertools.product , чтобы заменить фрагмент кода на

import itertools
for word1, word2 in itertools.product(buf1, buf2):
    if word1 == word2:
        print "BINGO " + word1 + ":" + word2
        break

. Другие функции itertools также подходят для других шаблонов.

10
ответ дан 27 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: