如何检查变量与两个可能的值是否匹配?

26

我有一个变量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模块。 - Jesse Dhillon
6个回答

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

3
@pythonrubies - 如果这是你在寻找的内容,请接受它作为答案。 @Jesse - 我建议您在代码片段中使用元组而不是列表。 - Matthew J Morrison
1
@Shaded 进行了一个快速的 timeit 测试。if-or 的执行时间是 5.57 微秒/函数,而 if-in 的执行时间是 5.22 微秒/函数(在 1000 万次迭代中)。 - shookster
@shookster:哇!我没想到会是这样,感谢你抽出时间进行测试! - Shaded
@Jesse,@Matthew:为什么元组比列表更适合这个?它们两者都可以使用,不是吗? - Dan
2
@Dan,有两个原因。首先,元组是不可变的,因此在语义上使用它们表示不会更改的值是合理的。在这种情况下,您将始终与 a、b、c、d 进行比较,而这些值在编译时已知,因此语义上正确的解决方案是使用不可变类型。其次,与第一个相关的是,当您使用元组时会获得性能/效率提升,我不记得具体细节,但您可以期望元组使用更少的内存并且实例化更快。 - Jesse Dhillon
显示剩余7条评论

15
 d = {'a':1, 'b':1, 'c':2, 'd':2}
 return d.get(s, 3)

我认为这相当聪明。 - Jesse Dhillon
现在我很好奇这是否更快。 - pythonrubies
2
它甚至可以进一步简化:return {'a':1, 'b':1, 'c':2, 'd':2}.get(s, 3) - James

1
if s in 'ab':
    return 1
elif s in 'cd':
    return 2
else:
    return 3

1
正如 @Jesse Dillon 所指出的,这仅适用于字符串,并且如果 s=='ab',它也会返回 1,但问题的限制非常明确 - s 是一个单字母字符串。 - Tim Pietzcker
没错,考虑到问题的参数,我认为这并不是错误的。+1 是因为展示了 __contains__ 是用于测试字符串中是否存在子字符串的谓词。 - Jesse Dhillon

1

也许使用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))

1
return 1 if (x in 'ab') else 2 if (x in 'cd') else 3

这将允许 x'ab''cd' - SilentGhost
@SilentGhost:意图是解决提出的问题而不是变体,OP说:“我有一个包含一个字母字符串的变量s”。 - Robert William Hanks
只需将'ab'和'cd'分别作为list('ab')和list('cd')放入,那么x就不能是'ab'和'cd'的组合。 - Stefan Gruenwald

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接