在Python中,what';如果x==1或x==5或x==10,那么还有其他一些方法可以写一个函数。。。?

在Python中,what';如果x==1或x==5或x==10,那么还有其他一些方法可以写一个函数。。。?,python,if-statement,Python,If Statement,我经常以编写类似这样的代码而告终 if x == 1 or x == 5 or x == 10 or x == 22 : pass 在英语中,重复x似乎是多余的,有没有更简单或更短的方法写出这样的if语句 可能是检查元组中是否存在x(1、5、10、22、)或其他什么?您可以将中的用于集合: if x in [1, 5, 10, 22]: # etc... if x in {1, 5, 10, 22}: # New syntax for creating sets

我经常以编写类似这样的代码而告终

if x == 1 or x == 5 or x == 10 or x == 22 :
    pass
在英语中,重复
x
似乎是多余的,有没有更简单或更短的方法写出这样的if语句


可能是检查元组中是否存在
x
(1、5、10、22、)或其他什么?

您可以将
中的
用于集合:

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

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

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

是的,您是对的-在元组中或在集合中(如果重复进行此检查)

你也可以

if x in (1, 5, 10, 22):
    pass
或者,如果您经常进行此检查,并且值的数量足够大

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

[...]

if x in myset:
    pass
myset
内容越有用,需要检查的值就越多。4个值非常少,因此可以保持简单。400个值,您应该使用集合


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

如果需要良好的性能,并且要重复多次相同的比较,请使用集合:

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

if x in s: # in your code
    pass

... 或者一套,就像我写的。对于4个值来说不那么紧急,对于40、400或4000更紧急……然而,元组更常见,而且集合在语义上更为友好,即使不考虑两者的性能优势(取决于后一种情况下的Python版本)。@glglglgl:哦,是的,集合是一个更好的主意。Tuple是常用的,但我认为它在语义上不是最合适的类型。在Python 2.7/3.*中,还可以使用set-literal:
{1,5,10,22}
。在Python3.2+中,如果您只是在
检查中执行
(虽然不是将结果保存在变量中),这甚至优化为透明地使用
frozenset
。+1表示第一个建议集,但我必须同意Dougal的观点,如果可能,您应该使用新语法。
set((1,5,10,22))
的版本比
{1,5,10,22}
的版本要多,而且IMHO的可读性也不是那么好。只有在检查一组非常大的对象时,由于散列的开销,集合才可能更好(更快)。当然,对于小数据集,元组可能更快(无需散列,更简单的数据结构,无冲突风险)在Python 3.2中,如果在条件中使用集合文字,则可以免费获得此优化(更好的是,仅创建一次冻结集)。此外,与所有性能问题相同的条款和条件:(1)衡量是否需要优化此项。(2)再次执行(3)真的确定吗?(4)好吧,很好!去收集你的选择并对它们进行基准测试。因此创建一个
冻结集
,比创建一个常规的
列表
,和一个
集合
?是的,
如果[1,50,10,22]中的x更易于编写和读取