说我想查看迭代中的某些对象(a
,b
,c
)是否在对象D
中。如果D
,pass
中没有。如果D
中至少有一个a
,则b
c
和D
必须位于 if any(i in D for i in (a,b,c)):
if all(i in D for i in (a,b,c)):
# do something
else:
raise Exception
,否则会引发错误。
Archive01.rar
MyFolder
file01.txt
file02.txt
file03.txt
etc.
有更多的pythonic /更少混淆的方式吗?
答案 0 :(得分:2)
我会在D"中做" x每个元素只测试一次:
ins = [i in D for i in (a, b, c)]
if any(ins):
if all(ins):
# do something
else:
raise Exception
借用phihag关于所有人与任何人之间的含义的观察:
ins = [i in D for i in (a, b, c)]
if all(ins):
# do something
elif any(ins):
# raise error
答案 1 :(得分:1)
你的Python代码已经是你的逻辑的几乎逐字的副本,所以我怀疑你可以简化测试。
由于all(X)
对非空X暗示any(X)
,因此您可以对它们进行重新排序,以便它们不会嵌套:
props = (a, b, c)
if all(i in D for i in props):
# do something
elif any(i in D for i in props):
raise Exception('Either all or none')
请注意,我还将(a, b, c)
拉出到辅助变量中,这可能会也可能不会提高清晰度,具体取决于复杂程度。
答案 2 :(得分:1)
如果a
,b
和c
可以播放,您可以使用集合来表达有用的方法:
elements = {a, b, c}
if not elements.isdisjoint(D):
if elements.issubset(D):
do_whatever():
else:
raise Whatever
答案 3 :(得分:1)
表达这种情况的紧凑方式可能是:
S = {a, b, c}
if set(D) & S not in (set(), S):
raise Exception()