如果全部在iterable中,如果至少有一个在iterable中,则为最python的方式

如果全部在iterable中,如果至少有一个在iterable中,则为最python的方式,python,list-comprehension,iterable,Python,List Comprehension,Iterable,假设我想查看iterable中的某些对象(a,b,c)是否在objectD中。如果D中没有,则pass。如果至少有一个在D中,则所有ab和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 有没有一种更具Python风格/不那

假设我想查看iterable中的某些对象(
a
b
c
)是否在object
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

有没有一种更具Python风格/不那么令人困惑的方法呢?

您的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)
提取到一个helper变量中,这可能会提高清晰度,也可能不会提高清晰度,这取决于复杂性。

您的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)
提取到一个helper变量中,这可能会提高清晰度,也可能不会提高清晰度,这取决于复杂性。

如果
a
b
c
是可散列的,您可以使用集合来用有用的命名方法来表示:

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

如果
a
b
c
是可散列的,则可以使用集合来表示,并使用有用的命名方法:

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

表示条件的简洁方法可以是:

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关于所有和任何事物之间含义的观察:

ins = [i in D for i in (a, b, c)]
if all(ins):
    # do something
elif any(ins):
    # raise error
我只会对每个元素进行一次“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关于所有和任何事物之间含义的观察:

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

您可以将
(a,b,c)
提取到一个变量。您可以将
(a,b,c)
提取到一个变量。如果
D
有大量键,这可能会非常慢。这是正确的。如果
D
不小,则不建议使用该方法。我也倾向于认为@user2357112采用的方法比这个方法更具可读性,可读性通常比紧凑性更重要。不管怎样,我们都必须检查
D
,所以我认为这里没有速度问题。
set(D)
中存在一个潜在的空间问题,我的代码在
isdisjoint
情况下避免了这个问题,但在
not isdisjoint
情况下就没有了这个问题(因为
issubset
构建了它的参数集)。@user2357112为什么我们无论如何都要检查
D
?我认为这是不对的。@StefanPochmann:嗯,我想如果我们在到达终点之前找到
a
b
c
,我们可以早点停下来,但如果我们没有,我们必须查看所有的
D
来确定我们处于哪种情况。如果
D
有大量的键,这可能会非常慢。这是正确的。如果
D
不小,则不建议使用该方法。我也倾向于认为@user2357112采用的方法比这个方法更具可读性,可读性通常比紧凑性更重要。不管怎样,我们都必须检查
D
,所以我认为这里没有速度问题。
set(D)
中存在一个潜在的空间问题,我的代码在
isdisjoint
情况下避免了这个问题,但在
not isdisjoint
情况下就没有了这个问题(因为
issubset
构建了它的参数集)。@user2357112为什么我们无论如何都要检查
D
?我认为这是不对的。@StefanPochmann:好吧,如果我们在到达终点之前找到所有的
a
b
、和
c
,我想我们可以早点停下来,但如果我们不停下来,我们就必须查看所有的
D
,找出我们处于哪种情况。@phihag:。@phihag:。