繁体   English   中英

在 Python 条件下中断的 while 循环

[英]While-loop with break under a condition in Python

我在 Python 中有一个 while-break-loop,它必须搜索带有字母 [('H', 'Y')] 的对。 一旦在 frozensets(第一个元素)中找到字母 H(混合“Y”和“N”)并在第二个元素中找到“Y”,它应该立即停止,并打印“No”。

def dt(z): 
    Y = all(letter=='Y' for number,letter in z)
    N = all(letter=='N' for number,letter in z)
    H = (not Y) and (not N)
    return 'Y' if Y else ('N' if N else 'H')

conj=[{(frozenset({(9,'N'), (3,'Y')}), 3,'Y'), (frozenset({(9,'Y'), (3,'N')}), 3,'Y')}, {(frozenset({(9,'Y'), (2,'Y')}), 3,'Y')}]

flag = 'Yes'
while flag == 'Yes':
    for i in conj:
        i = list(i)
        for j in i:
            s0 = list(j[0])
            t0 = list(j[-1])
            u0 = list(t0[-1])
            v0 = dt(s0)
            diag = list(zip(v0,u0))
            print(diag)
            if diag == [('H','Y')]:
                flag = 'No'
                break
    break
                
print(flag)

虽然它正确地推断出标志是“是”或“否”,但它正在搜索所有集合。 在上面的例子中,它给出了答案:

[('H', 'Y')]
[('Y', 'Y')]
No

[('Y','Y')] 不应该打印,它应该在运行 (frozenset({(9,'Y'), (3,'N')}), 3,'Y' 后停止). 这对于更复杂的集合非常有用。 我该如何改进呢? 一旦找到一对 [('H','Y')] 如果存在,它应该立即停止。

我不确定你的z参数的初始值是多少,但使用z = [('H', 'Y'), ('Y', 'Y')])并调整最后一个break的缩进似乎提供了预期的效果行为:

flag = 'Yes'
while flag == 'Yes':
    for i in conj:
        i = list(i)
        for j in i:
            s0 = list(j[0])
            t0 = list(j[-1])
            u0 = list(t0[-1])
            v0 = dt(s0)
            diag = list(zip(v0,u0))
            print(diag)
            if diag == [('H','Y')]:
                flag = 'No'
                break
        break
            
print(flag)

z = [('H', 'Y'), ('Y', 'Y')]
dt(z)

[('H', 'Y')]
No

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM