【问题标题】:How do you use OR,AND in conditionals?如何在条件句中使用 OR、AND?
【发布时间】:2012-06-04 04:47:29
【问题描述】:

我发现自己很多次,我需要全部或至少一个等于某物的东西,我会写这样的东西:

if a==1 and b==1:
   do something

if a==1 or b==1:
   do something

如果事情的数量很少,也可以,但仍然不够优雅。那么,对于大量事情,是否有更好的方法来执行上述操作?谢谢。

【问题讨论】:

  • 在这种情况下,您不会只关心其中一个是否只是1吗?你不需要第一次检查,你只需要or检查。
  • 第一个可以写a==1==b

标签: python conditional


【解决方案1】:

选项 1:任何/全部

对于一般情况,请查看anyall

if all(x == 1 for x in a, b, c, d):

if any(x == 1 for x in a, b, c, d):

您也可以使用任何可迭代对象:

if any(x == 1 for x in states):

选项 2 - 链接和插入

对于您的第一个示例,您可以使用布尔运算符链接:

if a == b == c == d == 1:

对于第二个示例,您可以使用 in:

if 1 in states:

选项 3:没有谓词的任何/全部

如果你只关心值是否真实,你可以进一步简化:

if any(flags):

if all(flags):

【讨论】:

  • 1 in [a, b, c, d] 不是很好; 1 in (a, b, c, d)。仅在下一步需要列表时才使用列表文字。
  • 因为使用可以使用元组的列表错误地宣传了使用列表执行某些您无法使用元组执行的操作(即改变元素)的意图。
  • 元组的制作也比列表便宜很多
  • 为什么说a==b==c==11 in a, b, c 一样只适用于常量?它适用于任何代替1 的表达式。而any(iterable)/all(iterable) 不会检查所有或至少一个元素是否非零,而是检查它们是否为真。
  • 感谢您指出我的回答不清楚。我试着清理一下。
【解决方案2】:

我喜欢这种形式,因为它在 Python 中易于理解

def cond(t,v):
    return t == v

a=1
b=3    
tests=[(a,1),(b,2)]

print any(cond(t,v) for t,v in tests)  # eq to OR  
print all(cond(t,v) for t,v in tests)  # eq to AND     

打印:

True
False

那么cond()可以根据需要变得复杂。

您可以提供用户可调用或使用operator module 以获得更大的灵活性:

import operator

def condOP(t,v,op=operator.eq):
    return op(t,v)

a=1
b=3    
tests=[(a,1,operator.eq),(b,2,operator.gt)]

print any(condOP(*t) for t in tests)  # eq to OR  
print all(condOP(*t) for t in tests)  # eq to AND 

甚至更简单:

tests=[(a,1,operator.eq),(b,2,operator.gt)]

print any(func(t,v) for t,v,func in tests)  # eq to OR  
print all(func(t,v) for t,v,func in tests)  # eq to AND     

【讨论】:

  • -0,我真的很讨厌你返回刚刚在 if 块中确定的 literal 布尔值。
  • @ch3ka:我想你可以使用另一种符合 Python 真假意义的转换。我个人喜欢文字布尔值。你没有?我猜你可以有return t==vreturn op(t,v)
  • @drewk 个人而言,我更喜欢 if cond(): 而不是 if cond() == True:,所以我更喜欢 return t==v 而不是 return True if t==v else False - IMO 甚至比你的 if cond(): return True return False 更pythonic
  • 详细与显式不同。 all(t == v for t, v in tests) 更简单,实际上更具可读性。
【解决方案3】:

看看这个

if all(x >= 2 for x in (A, B, C, D)):

其中 A、B、C、D 都是变量...

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2016-12-26
    • 2019-02-16
    • 2016-04-24
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多