在 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)

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

[('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