如果至少有一个可迭代,则大多数 pythonic 方式都可迭代

Most pythonic way if all in iterable if at least one in iterable

假设我想查看可迭代对象中的某些对象 (abc) 是否在对象 D 中。如果 none 在 Dpass 中。如果至少有一个在 D 中,则所有 a bc 必须在 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

是否有更 pythonic/less 令人困惑的方法?

您的 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) 提取到辅助变量中,这可能会或可能不会提高清晰度,具体取决于复杂性。

如果 abc 是可散列的,您可以使用集来通过命名方法来表达这一点:

elements = {a, b, c}
if not elements.isdisjoint(D):
    if elements.issubset(D):
        do_whatever():
    else:
        raise Whatever

表达条件的简洁方式可以是:

S = {a, b, c}
if set(D) & S not in (set(), S):
    raise Exception()

我会为每个元素只做一次 "x in D" 测试:

ins = [i in D for i in (a, b, c)]
if any(ins):
    if all(ins):
         # do something 
    else:
         raise Exception

并借用 phihag 对 all 和 any 之间蕴涵的观察:

ins = [i in D for i in (a, b, c)]
if all(ins):
    # do something
elif any(ins):
    # raise error