如何以Python结束后重新启动for循环?

时间:2017-11-01 13:56:07

标签: python for-loop

我有以下功能:

def spell_checker(w):
     correzione = []
     limite = 2
     for word in frequenza():
         res = edit_distance(word.lower(), w)
        if word not in correzione:
              if res == 0: 
              correzione.append(w)
              break
        if res > 0 and res < limite: 
           correzione.append(word)

return correzione

所以我需要做的是:当for循环结束时,如果列表 correzione 为空,我想将 limite 增加一个,然后重新开始环。

如果我在循环中放置限制+ = 1,它会在列表为空的任何时候增加,但是只有在它的所有内容都是空的时候才需要它。

可能是这样的:

if len(correzione) == 0:
    limite += 1
for word in frequenza():
    #same loop as before

但这太过分了!

2 个答案:

答案 0 :(得分:0)

为了简单起见,您可以使用while循环继续工作,直到列表不为空:

    def spell_checker(w):
    correzione = []
    limite = 2
    while len(correzione) == 0:
        for word in frequenza():
            res = edit_distance(word.lower(), w)
            if word not in correzione:
                if res == 0: 
                    correzione.append(w)
                    break
            if res > 0 and res < limite: 
                correzione.append(word)
        if len(correzione) == 0:
            limite += 1
    return correzione

答案 1 :(得分:0)

正如@Megalng提出的那样,在这种情况下递归似乎很合理。这样的事情可能是:

from edit_distance import edit_distance


MAX_LIMIT = 10


def frequenza():
    return ['first', 'second', 'third']


def spell_checker(w, limite=1):
    global MAX_LIMIT
    if limite > MAX_LIMIT:
        raise RuntimeError('Stack overflow!')

    correzione = []

    for word in frequenza():
        res = edit_distance(word.lower(), w)

        if word not in correzione:
            if res == 0:
                correzione.append(w)
                break

        if 0 < res < limite:
            correzione.append(word)

    if not correzione:
        return spell_checker(limite + 1)
    return correzione


def main():
    print(spell_checker('awordofmine'))


if __name__ == '__main__':
    main()

果然,您可以使用类而不是全局变量,或者以某种方式处理您的限制,如返回None,如果可以放弃的话。