具有in关键字意外行为的Python控制流

时间:2014-09-14 13:32:04

标签: python control-flow

我正在尝试打印"是"或"否" (为清晰起见,引号)取决于文本字符串中是否存在模式的任何排列。

from itertools import permutations


i = int(input())

for j in range(i):
    m = input()
    n = input()

    lst = []
    for k in permutations(m):
        lst.append("".join(k))

    for l in lst:
        if l in n:
            print("YES")
            break
        else:
            print("NO")
            break

    print(lst)

这是示例输入:

3
hack
indiahacks
code
eddy
coder
iamredoc

这是预期的输出

YES
NO
YES

对于前两个输入,输出正确,第三个输出是失败的输出。

/home/ajay/.pyenv/versions/3.4.1/bin/python3.4 /home/ajay/PycharmProjects/LearnPython/test.py
1
coder
iamredoc
NO
['coder', 'codre', 'coedr', 'coerd', 'corde', 'cored', 'cdoer', 'cdore', 'cdeor', 'cdero', 'cdroe', 'cdreo', 'ceodr', 'ceord', 'cedor', 'cedro', 'cerod', 'cerdo', 'crode', 'croed', 'crdoe', 'crdeo', 'creod', 'credo', 'ocder', 'ocdre', 'ocedr', 'ocerd', 'ocrde', 'ocred', 'odcer', 'odcre', 'odecr', 'oderc', 'odrce', 'odrec', 'oecdr', 'oecrd', 'oedcr', 'oedrc', 'oercd', 'oerdc', 'orcde', 'orced', 'ordce', 'ordec', 'orecd', 'oredc', 'dcoer', 'dcore', 'dceor', 'dcero', 'dcroe', 'dcreo', 'docer', 'docre', 'doecr', 'doerc', 'dorce', 'dorec', 'decor', 'decro', 'deocr', 'deorc', 'derco', 'deroc', 'drcoe', 'drceo', 'droce', 'droec', 'dreco', 'dreoc', 'ecodr', 'ecord', 'ecdor', 'ecdro', 'ecrod', 'ecrdo', 'eocdr', 'eocrd', 'eodcr', 'eodrc', 'eorcd', 'eordc', 'edcor', 'edcro', 'edocr', 'edorc', 'edrco', 'edroc', 'ercod', 'ercdo', 'erocd', 'erodc', 'erdco', 'erdoc', 'rcode', 'rcoed', 'rcdoe', 'rcdeo', 'rceod', 'rcedo', 'rocde', 'roced', 'rodce', 'rodec', 'roecd', 'roedc', 'rdcoe', 'rdceo', 'rdoce', 'rdoec', 'rdeco', 'rdeoc', 'recod', 'recdo', 'reocd', 'reodc', 'redco', 'redoc']

Process finished with exit code 0

您可以看到排列列表中存在redoc,但为什么python in关键字无法识别它,从而产生NO输出。

1 个答案:

答案 0 :(得分:4)

在检查列表中的第一项后,您立即突破了列表中的循环。

而不是:

for l in lst:
    if l in n:
        print("YES")
        break
    else...

如果必须使用循环结构,则可以使用以下命令恢复代码:

for l in lst:
    if l in n:
        print("YES")
        break
else: # this will run after (and only if) exhausting your loop.
    print("NO")

Raymond Hettinger认为else的这种用法应该被称为nobreak,我认为这是对它的直觉。


这是usage of the else clause on loops, and is documented here