2012-04-08 22 views
9

我常常落得像在Python中,有什么其他方法可以编写if x == 1或x == 5或x == 10 ...?

if x == 1 or x == 5 or x == 10 or x == 22 : 
    pass 

在英语这似乎是多余的不断重复x编写代码,有没有写出来的if语句一样,更容易或更短的方法是什么?

也许检查存在x的值在一个元组(1, 5, 10, 22,)什么?

+2

呀,'如果x [1,50,10,22]'是简单的写并按照我的写法阅读 – 2012-04-08 18:49:26

回答

14

是的,你是对的 - 无论是在一个元组中,或者(如果这个检查是重复进行的)。

因此,无论做

if x in (1, 5, 10, 22): 
    pass 

,或者,如果你经常这样做检查和值的数量足够大,

myset = set((1, 5, 10, 22)) 

[...] 

if x in myset: 
    pass 

myset东西是比较有用的,更多的价值,你想检查。 4值很少,所以你可以保持简单。 400的值,你应该使用该集合...

正如Marcin所指出的,另一个方面是在集合中查找所需的散列,这可能比线性搜索列表或元组所需的值更昂贵。

+7

在Python 2.7/3. *中,您也可以使用set literal:'{1,5,10,22}'。在Python 3.2+中,如果您只是在进行'in'检查(即使不是将结果保存在变量中),它甚至会优化为透明地使用'frozenset'。 – Dougal 2012-04-08 18:52:39

+2

+1首先建议设置,但我必须同意Dougal的意见,如果可能的话,您应该使用新的语法。 – 2012-04-08 18:57:43

+1

'set((1,5,10,22))'比'{1,5,10,22}'有更多的版本,而且实际上并不是那些更具可读性的恕我直言。 – martineau 2012-04-08 20:29:20

6

可以使用in一个集合:

if x in [1, 5, 10, 22]: 
    # etc... 

if x in {1, 5, 10, 22}: # New syntax for creating sets 
    # etc... 

注意,这将每行执行时创建一个新的列表。如果效率是一个问题,只需创建一次该集合并重用它。

+0

...或一套。没有那么紧急4值,更紧迫的40,400或4000 ... – glglgl 2012-04-08 18:51:48

+0

然而,一个元组更常见,并且一个集合在语义上更好,即使折扣性能都会受到影响(取决于后一种情况下的Python版本) 。 – delnan 2012-04-08 18:53:50

+0

@glglgl:哦,是的,一套是一个更好的主意。元组常用,但我认为它不是语义上最合适的类型。 – 2012-04-08 18:54:19

2

如果你需要性能良好,要重复相同的比较好几次,使用一组:

s = frozenset([1, 5, 10, 22]) # at the beginning 

if x in s: # in your code 
    pass 
+3

当然,对于小数据集,元组可能会更快(不需要散列,更简单的数据结构,没有碰撞风险),并且在Python 3.2中,您可以免费获得此优化(甚至更好,冻结集仅创建一次)if你在条件中使用一组字面值。此外,与所有性能问题相同的条款和条件:(1)衡量您需要优化的条件。 (2)再次做#2! (3)真的有把握吗? (4)好,很好!去收集你的选择并做好基准。 – delnan 2012-04-08 18:56:56

+0

因此创建一个'frozenset',比创建一个普通的'list'和一个'set'更快? – George 2012-04-08 19:25:50

相关问题