【发布时间】:2021-11-25 07:23:49
【问题描述】:
我在 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')],它应该立即停止。
【问题讨论】:
-
粗略一瞥,似乎最后一个
break需要再缩进一层以与for j in i:循环块对齐(最后一个break在当前位置是不必要的,最外层for-loop 在完成所有循环后总是会中断)。 -
在这种情况下,在没有 ('H','Y') 对的情况下,它似乎会经历一个无限循环。
-
这里的答案可能会对您有所帮助。 stackoverflow.com/questions/189645/…
-
传递给
def dt(z):的z的初始值是多少?
标签: python if-statement while-loop break