2012-04-08 45 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

相關問題