Где break заканчивает цикл For

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

# Load a corpus and build a language model
def load_model(filename):
"""Loads a corpus file and builds a language model consisting of word:frequency.
Converts all words to lowercase, strips punctuation, and ignores any non-alphabetic characters."""

    dictionary = {}
    f = open(filename)
    for line in f:
        words = line.split(' ') # Split each word and iterate through.
        for string in words:

            for c in string: # Check each character value for punctuation or numeric type.

                if c in Punct:
                    string = string.replace(c,"")
                if c.isdigit()
                    print String + ' is not formattable.\n'
                    break

            string = string.lower()
            if string in dictionary:
                dictionary[string] = dictionary[string] + 1
            else:
                dictionary[string] = 1
    f.close()
    return dictionary

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

Завершает ли break цикл, в котором он находится, или первый цикл: ("for line in f")

И continue просто завершит этот конкретный цикл.

Я хочу, чтобы он заканчивал проверку всей строки и переходил к следующей строке в словах.


person alvarezcl    schedule 22.04.2014    source источник
comment
Вероятно, мне также не следует использовать строку в качестве имени переменной.   -  person alvarezcl    schedule 22.04.2014
comment
не стесняйтесь редактировать свой вопрос   -  person niklasfi    schedule 22.04.2014
comment
Break завершает самый внутренний цикл.   -  person Kyle Strand    schedule 22.04.2014
comment
Почему бы вам сначала не поэкспериментировать и не посмотреть, что получится, прежде чем спрашивать?   -  person ρss    schedule 22.04.2014
comment
Какой результат вы получите с текущим кодом?   -  person laurencevs    schedule 22.04.2014


Ответы (3)


Из документации:

Оператор break, как и в C, вырывается из наименьшего замыкающего цикла for или while.

Согласно этому вопросу, Python не поддерживает построить как break 2, как это делает PHP.

person Bart Friederichs    schedule 22.04.2014

break выйдет из самого внутреннего цикла, в котором он находится.

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

Но я не понимаю, почему ты хочешь это сделать. break, который у вас есть, выглядит нормально: он прекратит обработку символов текущей строки и перейдет к проверке следующей строки.

В вашем коде есть некоторые ошибки. Я исправил их для вас и некоторые проблемы со стилем:

def load_model(filename):
    dictionary = {}
    with open(filename) as f:
        for line in f:
            words = line.split(' ')  # Split each word and iterate through.
            for word in words:
                for c in word:  # Check each character value for punctuation or numeric type.
                    if c in Punct:
                        word = word.replace(c, "")
                    if c.isdigit():
                        print word + ' is not formattable.\n'
                        break

                word = word.lower()
                if word in dictionary:
                    dictionary[word] += 1
                else:
                    dictionary[word] = 1
    return dictionary
person janos    schedule 22.04.2014

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

for x in X:
    for y in Y:
        break

Цикл x завершится, цикл y прервется.

Вы можете вызвать разрыв внешнего цикла, возможно, установив переменную в качестве флага:

break_outer = False
for x in X:
    for y in Y:
        if condition:
            break_outer = True
            break
    if break_outer:
        break

Пример:

for x in range(3):
    for y in range(2):
        if x == 2:
            break
        print "x =",x,"y =",y

выход:

>>> x = 0 y = 0
>>> x = 0 y = 1
>>> x = 2 y = 0
>>> x = 2 y = 1

И чтобы разорвать внешний цикл, вы должны передать переменную вверх:

break_outer = False
for x in range(3):
    for y in range(2):
        if x == 2:
            break_outer = True
            break
        print "x =",x,"y =",y
    if break_outer:
        break

выход:

>>> x = 0 y = 0
>>> x = 0 y = 1

continue пропускает остальной код, оставшийся в цикле, и переходит к следующей итерации в цикле for:

for i in range(3):
    if i == 1:
        continue
    print i

выход:

>>> 0
>>> 2

Ваш код, похоже, делает то, о чем вы просите, breaking и переходит к следующему слову... было ли что-то еще в коде, что давало нежелательный результат?

person Farmer Joe    schedule 22.04.2014