如果至少有一个可迭代,则大多数 pythonic 方式都可迭代
Most pythonic way if all in iterable if at least one in iterable
假设我想查看可迭代对象中的某些对象 (a
、b
、c
) 是否在对象 D
中。如果 none 在 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
是否有更 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)
提取到辅助变量中,这可能会或可能不会提高清晰度,具体取决于复杂性。
如果 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()
我会为每个元素只做一次 "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
假设我想查看可迭代对象中的某些对象 (a
、b
、c
) 是否在对象 D
中。如果 none 在 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
是否有更 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)
提取到辅助变量中,这可能会或可能不会提高清晰度,具体取决于复杂性。
如果 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()
我会为每个元素只做一次 "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