2011-07-27 20 views
10

içinde birden çok öğeyle karşılaştırılıyor facility adlı bir dizeyi geçerli olup olmadığını sınamak için birden çok olası dizeyle karşılaştırmaya çalışıyorum. Geçerli görürsün:Bir dize Python

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

if facility in accepted_strings: 
    do_stuff() 
: dizelerine ilişkin liste iğrenç uzun alır sürece, böyle bir şey muhtemelen en iyi
if facility == "auth" or facility == "authpriv" ... 

cevap

24

OTOH, dizelerine ilişkin liste gerçekten iğrenç uzun, Eğer bir dizi kullanın: Bir sette çevreleme için

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

if facility in accepted_strings: 
    do_stuff() 

Test (1) ortalama Ç olduğunu.

+0

Evet, http://wiki.python.org/moin/PythonSpeed, python'daki verimlilik genel bir bakışla ilgilenen herkes için oldukça iyi bir okumadır. set() 'eder misiniz? –

+0

Bu +1 için teşekkürler, kabul edilen – n0pe

+0

Bunun bir potansiyel olumsuz yanı, bunların üzerinde yineleme sırasının tahmin edilemez hale gelmesidir, ancak bunları başka bir şey için kullanıyorsanız, yalnızca bir problemdir. Bir yardım mesajında ​​kabul edilen dizelerin listesini yazdırın.) – Ben

10

edilir

:

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

bunun dışında diğer yapmanın etkili bir yolu var mı

+0

oh harika teşekkür ederim. Listem gerçekten uzun sürerse ne olur? – n0pe

+0

Bu sadece küçük bir şakaydı, çünkü elinizle 10.000 dizginin bir listesini yazmak istemezsiniz. –

+0

Orijinal olarak kullandığım bu seçenek, ancak uygulamam geliştikçe @ pillmucher'in yanıtını kabul edeceğim. Teşekkürler +1 – n0pe

2

Bir dizenin bir çok ile eşleşip eşleşmediğini etkin bir şekilde kontrol etmek için şunu kullanın:

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

set() s Belirli bir öğenin içinde olup olmadığının saptanması için optimize edilmiş, sıralanmamış öğelerin koleksiyonları olan karma şeklindedir.

+0

Hızla ilgili endişeleriniz varsa, bir grup oluşturmak için tekrarlamak için bir listeden daha hızlı bir şekilde biraz daha hızlıdır. – agf

+0

Neden set() ', * args (sadece denedi) kabul etmiyor? :( –

+0

Neden olduğu hakkında hiçbir fikrim yok. Uzmanlığım CPython bayt kod manipülasyonudur. –

İlgili konular