【发布时间】:2018-08-03 07:55:06
【问题描述】:
假设我想检查一个变量是否等于几个值之一。我应该使用以下哪种表达方式?
if s == 'one' or s == 'two' or s == 'three':
pass
if s in ('one', 'two', 'three'):
pass
if s in ['one', 'two', 'three']:
pass
if s in {'one', 'two', 'three'}:
pass
编辑:从答案/cmets,我了解到:
- 最不推荐第一个变体,其他变体被视为同样“pythonic”。
- 对于短序列,检查成员资格的性能差异可以忽略不计。元组的创建成本最低,集合需要计算哈希。
- 这四种变体在某些极端情况下并不等价:
-
in运算符检查身份和相等性。 - 逻辑
or短路。我怀疑元组和列表的成员资格测试应该按顺序评估,因此也应该短路。 - 集合需要可散列的元素。
-
【问题讨论】:
-
我通常使用集合,因为复杂度为 O(1)。
-
如果可以重复使用该套装,理论上最后一个更快,但对于仅三个项目没有实质性差异。
-
请注意,它们并非严格相等
==检查相等,但in运算符检查相等或身份 -
@NicolasMalebranche 是的,请参阅stackoverflow.com/a/48867273/6260170