【问题标题】:How does Python evaluate multiple conditions in or statement?Python 如何评估 or 语句中的多个条件?
【发布时间】:2015-03-22 18:06:28
【问题描述】:

偶尔,我想检查一下这个问题:

a = 'my string'
if 'string1' in a or 'string2' in a or 'string3' in a ... or 'stringN' in a:
    [[do something]]
else:
    [[something else]]

假设我知道'string1' in a 有 90% 的机会计算为 True。如果'string2' in a 在这种情况下'string1' in aTrue,Python 还会评估吗?还是在技术上写起来更有效率:

if 'string1' in a:
    [[do something]]
elif 'string2' in a:
    [[do something]]
elif 'string3' in a:
    [[do something]]
...
elif 'stringN' in a:
    [[do something]]
else:
    [[something else]]

【问题讨论】:

  • 您的第二个代码与第一个代码非常不同。他们不这样做。
  • 他们没有?每个elif 子句都是对同一事物的重复调用。您将如何达到他们不做同样事情的状态?
  • 更具可读性的版本:strings = ['string1', 'string2', 'string3', ..., 'stringN'] 然后是if any(s in a for s in strings):。效果相同(短路)。
  • 或者使用any((True if s in a for s in strings)) 这样生成器可以在any 中早点返回,我想。糟糕,n/m 没有看到您正确使用 any
  • @prpl.mnky.dshwshr 我认为他在这里将[[do something]] 作为占位符。在实际情况下,它会做不同的事情,因此,为任何语句设置特殊情况与将它们放在一起(如第一种情况)是不一样的。

标签: python conditional-statements boolean-logic


【解决方案1】:

我知道这不是你的问题,但你应该考虑在这种情况下使用集合。

代替:

if 'string1' in a or 'string2' in a or 'string3' in a ... or 'stringN' in a:

你可以这样做:

if set(a.split()).intersection({'string1','string2', ... }):

以这种方式使用集合比多个条件 if 语句更简洁、更快。

编辑:请注意,以上内容仅适用于检查单个单词之间是否存在空格。

【讨论】:

  • 嗯,获取一组字符串会为您提供单个字符,因此您永远不会匹配多字符字符串。
  • 我在想a 是一个字符串列表,但是看看 OP 我是不正确的。谢谢。
  • 现已更正。不过,它只适用于检查单个单词。
  • 现已更正。不过,它仅适用于检查单个单词。 @Dunes' answer 更好。
【解决方案2】:

在这种情况下,or stalemate 和 if 阶梯是等价的。 or 语句应该是首选,因为它减少了代码重复。如果其中一个字符串在给定字符串中,则如果您想做一些不同的事情,您只需更改一段代码。

如果您有很多字符串要搜索它们,您可能会发现最好使用any 函数和生成器。

any(s in a for s in strings) 

上面的计算结果与 or 语句相同,其中strings 是您正在搜索的字符串列表。它还会在第一次评估为True 时停止检查s in a 是否。

【讨论】:

  • 我认为这可能是迄今为止建议的最佳方法。
【解决方案3】:

or and and both use short-circuiting;他们只会评估确定结果所需的尽可能多的条件。所以,如果'string1' in a 返回True'string2' in a 将永远不会被触及。

【讨论】:

    【解决方案4】:

    不,它会在评估 True 时停止。因为在or 运算符中,一个True 就足以处理该语句。如果任何条件在那里返回True,例如string1 为True,则其他条件将不会处理。如您所知,除了False or False,每个条件都是True,因此无需检查其余条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多