2011-07-27 25 views
10

facilityという文字列を複数の可能な文字列と比較して、有効かどうかをテストしようとしています。有効な文字列は以下のとおりです。Pythonで文字列を複数の項目に比較する

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

if facility in accepted_strings: 
    do_stuff() 
:文字列のリストが恐ろしく長くなっていない限り、このようなものは、おそらく最高
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

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

よりも、この他を行うための効率的な方法があります

+0

よろしくお願い致します。私のリストが実際に本当に長くなったらどうなりますか? – n0pe

+0

それは手作業で10,000文字列のリストを入力したくないので、ちょっとした冗談でした。 –

+0

これは私が当初使用したオプションですが、アプリケーションが大きくなるにつれて私は@ pillmucherの答えを受け入れるつもりです。ありがとう+1 – n0pe

2

文字列が多くの文字列と一致するかどうかを効率的にチェックするには、次のように使用します。

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

set()は、アイテムが含まれているかどうかを判断するために最適化された順序付けられていないアイテムのコレクションです。

+0

あなたがスピードを心配している場合は、リストよりもタプルをアセンブルして、セットを反復してセットを作成する方が少し速いです。 – agf

+0

なぜ 'set()'は* argsを受け入れていないのですか? : –

+0

私の専門はCPythonのバイトコード操作です –

関連する問題