2011-07-27 77 views
10

我試圖將名爲facility的字符串與多個可能的字符串進行比較以測試它是否有效。有效的字符串是:將字符串與Python中的多個項目進行比較

auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0, ... , local7 

難道還有比這樣做其它的有效方法:

if facility == "auth" or facility == "authpriv" ... 

回答

24

如果OTOH,你的字符串列表確實是可怕長,使用一組:

accepted_strings = {'auth', 'authpriv', 'daemon'} 

if facility in accepted_strings: 
    do_stuff() 

測試在一組遏制是O(1)平均。

+0

是的, http://wiki.python.org/moin/PythonSpeed對於那些對python的效率有一個總體概述感興趣的讀者來說是非常不錯的閱讀方式,儘管你不會碰巧知道' –

+0

感謝這個+1,接受 – n0pe

+0

這樣做的一個潛在缺點是迭代的順序變得不可預知,但如果你用它來做其他事情(如在幫助消息中打印接受的字符串列表) – Ben

10

除非你的字符串列表變得可怕長,這樣的事情可能是最好的:

accepted_strings = ['auth', 'authpriv', 'daemon'] # etc etc 

if facility in accepted_strings: 
    do_stuff() 
+0

哦真棒謝謝你。如果我的列表真的變得很長,會發生什麼? – n0pe

+0

這只是一個小笑話,因爲你不想手動輸入10,000個字符串的列表。 –

+0

這是我最初使用的選項,但隨着我的應用程序可能增長,我將接受@ pillmucher的答案。謝謝+1 – n0pe

2

爲了有效地檢查一個字符串匹配的一處,用這個:

allowed = set(('a', 'b', 'c')) 
if foo in allowed: 
    bar() 

set() s被散列,項目的無序集合被優化以確定給定項目是否在其中。

+0

如果你擔心速度,組裝一個元組要比列表迭代稍微快一些來創建集合。 – agf

+0

爲什麼'set()'accept * args(剛剛試過)? :( –

+0

我不知道爲什麼,我的專業是CPython字節碼操作 –

相關問題