2012-04-08 2 views
9

나는 종종파이썬에서는 x == 1 또는 x == 5 또는 x == 10 인 경우를 작성하는 다른 방법은 무엇입니까?

x을 계속 반복하는 중복 보인다 영어로
if x == 1 or x == 5 or x == 10 or x == 22 : 
    pass 

과 같은 코드를 작성 결국, 그와 같은 경우 문을 쓰기 쉽게 또는 짧은 방법은 무엇입니까?

튜플 (1, 5, 10, 22,) 또는 무엇인가에 x의 값이 있는지 확인하고 싶습니까?

+2

그래,'에서 x는 [1, 50, 10, 22] '간단 쓰기하는 경우 그리고 내가 쓴 것처럼 –

답변

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

파이썬 2.7/3. *에서는 세트 리터럴 인'{1, 5, 10, 22}'를 사용할 수 있습니다. Python 3.2+에서는'in' 체크 만하는 경우 (변수에 결과를 저장하는 것이 아니라면) 투명하게'frozenset'을 사용하도록 최적화합니다. – Dougal

+2

첫 번째 세트를 제안하는 +1,하지만 가능한 경우 새로운 구문을 사용해야한다는 Dougal에 동의해야합니다. –

+1

'set ((1, 5, 10, 22))'는'{1, 5, 10, 22} '보다 더 많은 버전에서 작동하며 정말로 읽을 수있는 IMHO가 아닙니다. – martineau

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

+0

그러나 튜플이 더 일반적이며 집합은 성능 보너스를 모두 할인하는 경우에도 의미가 있습니다 (후자의 경우 Python 버전에 따라 다름) . – delnan

+0

@glglgl : 네, 세트가 더 좋습니다. 튜플이 일반적으로 사용되지만 의미 론적으로 가장 적절한 유형이 아닌 것 같습니다. –

2

:

s = frozenset([1, 5, 10, 22]) # at the beginning 

if x in s: # in your code 
    pass 
+3

물론 작은 데이터 세트의 경우 튜플이 더 빠를 수 있습니다 (해시가 필요없고 데이터 구조가 간단하고 충돌 위험이 없음). 파이썬 3.2에서는이 최적화를 무료로 사용할 수 있습니다 (frozenset은 한 번만 생성됩니다) if 조건에 설정된 리터럴을 사용합니다. 또한 모든 성과 문제와 동일한 조건이 적용됩니다. (1)이를 최적화해야하는 기준을 측정하십시오. (2) 다시 # 2하십시오! (3) 정말 확실한가요? (4) 글쎄, 좋아! 선택 사항을 수집하고 잘 벤치마킹하십시오. – delnan

+0

그래서'frozenset'을 만드는 것은 일반적인'list'와'set'을 만드는 것보다 빠릅니까? – George

관련 문제