【问题标题】:How to check variable against 2 possible values?如何根据 2 个可能值检查变量?
【发布时间】:2010-07-15 21:01:56
【问题描述】:

我有一个包含一个字母字符串的变量 s

s = 'a'

根据该变量的值,我想返回不同的东西。到目前为止,我正在按照以下方式做一些事情:

if s == 'a' or s == 'b':
   return 1
elif s == 'c' or s == 'd':
   return 2
else: 
   return 3

有没有更好的方法来写这个?一种更 Pythonic 的方式?或者这是最有效的?

以前,我错误地有这样的事情:

if s == 'a' or 'b':
   ...

显然这不起作用,而且我很愚蠢。

我知道条件赋值并尝试过这个:

return 1 if s == 'a' or s == 'b' ...

我想我的问题是,有没有一种方法可以将一个变量与两个值进行比较,而无需输入 something == something or something == something

【问题讨论】:

  • 问题:你用这段代码做什么?您是否正在切换命令行选项,因为如果您正在切换,则应该查看 getopt 模块。

标签: python


【解决方案1】:
if s in ('a', 'b'):
    return 1
elif s in ('c', 'd'):
    return 2
else:
    return 3

【讨论】:

  • @pythonrubies - 如果这是您正在寻找的内容,请接受它作为答案。 @Jesse - 我建议在您的代码 sn-p 中使用元组而不是列表。
  • 快速提问,@Jesse Dhillon 的回答和@Tim Pietzcker 有什么区别吗?
  • Tim's 仅适用于字符串,这适用于您可以测试相等性的任何对象。
  • @Shaded 做了一个快速的 timeit 测试。 if-or 是 5.57 usec/func,if-in 是 5.22 usec/func(超过 10M 次迭代)。
  • @Dan,有两个原因。首先,元组是不可变的,因此在语义上将它们用于不改变的值是有意义的。在这种情况下,您将始终与 a, b, c, d 进行比较,并且这些值在编译时是已知的,因此语义上正确的解决方案是使用不可变类型。其次,与第一个相关的是,当您使用元组时会提高性能/效率,我不记得细节,但您希望元组使用更少的内存并更快地实例化。
【解决方案2】:
 d = {'a':1, 'b':1, 'c':2, 'd':2}
 return d.get(s, 3)

【讨论】:

  • 我会说这很聪明。
  • 现在我很好奇这是否更快。
  • 它甚至可以进一步减少:return {'a':1, 'b':1, 'c':2, 'd':2}.get(s, 3)
【解决方案3】:

如果只返回固定值,字典可能是最好的方法。

【讨论】:

    【解决方案4】:
    if s in 'ab':
        return 1
    elif s in 'cd':
        return 2
    else:
        return 3
    

    【讨论】:

    • 正如@Jesse Dillon 所指出的,这仅适用于字符串,并且如果s=='ab' 也将返回1,但问题的限制是具体的-s 是一个字母字符串.
    • 对,考虑到问题的参数,我不会说这是错误的。 +1 用于证明 __contains__ 是用于测试字符串中是否存在子字符串的谓词。
    【解决方案5】:
    return 1 if (x in 'ab') else 2 if (x in 'cd') else 3
    

    【讨论】:

    • 这将允许x 成为'ab''cd'
    • @SilentGhost:目的是解决提出的问题而不是变体,OP 说“我有一个包含一个字母字符串的变量 s”
    • 只要把 'ab' 和 'cd' 作为 list('ab') 和 list('cd') 那么 x 不能是 'ab' 和 'cd' 的组合。
    【解决方案6】:

    也许使用 if else 进行更多的自我记录:

    d = {'a':1, 'b':1, 'c':2, 'd':2} ## good choice is to replace case with dict when possible
    return d[s] if s in d else 3
    

    还可以使用 if else 来实现流行的第一个答案:

      return (1 if s in ('a', 'b') else (2 if s in ('c','d') else 3))
    

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多