2011-07-27 3 views
10

facility 문자열을 여러 가능한 문자열과 비교하여 유효한지 테스트하려고합니다. 유효한 문자열은 다음과 같습니다문자열을 파이썬의 여러 항목과 비교하기

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() 

테스트하는 것은 (1) 평균 O입니다.

+0

예, 그 방법이 될 것입니다. http://wiki.python.org/moin/PythonSpeed는 파이썬의 효율성에 대한 전반적인 개요에 관심있는 사람들에게 꽤 좋은 책입니다. –

+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 바이트 코드 조작이다. –

관련 문제