from collections import defaultdict
n, m = map(int, input().split())
di = defaultdict(list)
while n > 0:
n -= 1
a, b = input().split()
di[a].append(b)
di[b].append(a)
while m > 0:
m -= 1
se = set(input().split()[1:])
flag = True
for x in se: # 枚举集装箱货品清单
if x in di: # 判断该货物是否在字典中
for y in di[x]: # 枚举与该货物不相容的货物
if y in se: # 如果与该货物不相容的货物在集合中,则容易造成爆炸
print("No")
flag = False
break
if not flag:# 利用flag标记法跳出多层循环
break
if flag:
print("Yes")
将上面代码改为抛出异常跳出多层循环:
from collections import defaultdict
n,m = map(int,input().split())
di = defaultdict(list)
while n > 0:
n -= 1
a,b = input().split()
di[a].append(b)
di[b].append(a)
class BreakAllLoops(Exception):# 继承Exception类
pass
"""
当在Python中定义一个类、函数、循环或条件语句时,如果暂时不想在其中添加任何代码,
但又希望保持结构的完整性,就可以使用 pass 语句
"""
while m > 0:
m -= 1
se = set(input().split()[1:])
flag = True
try:
for x in se: # 枚举集装箱货品清单
if x in di: # 判断该货物是否在字典中
for y in di[x]:# 枚举与该货物不相容的货物
if y in se:# 如果与该货物不相容的货物在集合中,则容易造成爆炸
print("No")
raise BreakAllLoops # 抛出异常以跳出所有循环 raise v.引发,导致
except:
pass # 异常被捕获,跳出所有循环
else:
print("Yes") # 如果没有抛出异常,则执行这里的代码
使用交集运算简化上面的代码:
from collections import defaultdict
n, m = map(int, input().split())
di = defaultdict(set)
while n > 0:
n -= 1
a, b = input().split()
di[a].add(b)
di[b].add(a)
while m > 0:
m -= 1
se = set(input().split()[1:])
flag = True
for x in se: # 枚举集装箱货品清单
"""
如果x货物在字典中 并且 与x货物不相容的货物集合与集装箱货品清单的交集非空
则该集装箱货品清单中有与x货物不相容的货物
"""
if x in di and di[x] & se:
print("No")
flag = False
break
if flag:
print("Yes")