2010-12-15 5 views

답변

16

어쩌면

3 not in [1, 2, "a"] 
# True 
+0

튜플이 더 좋지 않습니까? – user225312

+0

@A A : OP는 요소가 목록에 있는지 확인하도록 요청했습니다. 아마도 그 목록은 자신의 코드에 하드 코딩되지 않을 것입니다. –

3

참고 : 딕셔너리의 키와 요소를 넣을 수 있습니다 경우, 회원 가입을 테스트하는 해시 알고리즘에 훨씬 빠르고 감사합니다. 목록이 너무 길거나 앱이 이런 종류의 일을 많이하는 경우에만 문제가됩니다. 그렇지 않으면 스벤 (Sven)이 말했듯이 "X는 Y가 아니다"라고 말한다.

any(isinstance(x, int) for x in alist) 

:

+4

이 경우 세트를 사용할 수도 있습니다. –

+2

dict 값을 사용하지 않는 경우 집합을 사용해야합니다. – FogleBird

0

당신은 (스벤 Marnach에 의해)

bool([x for x in alist if isinstance(x, int)]) 

더 나은 버전을 의미합니까?

+0

이것은 OP가 원했던 것이고 이것이 더 간결하고 첫 번째 int가 발견되면 iterating을 멈추기 때문에 OP를 원한다면, 그것을 'any (isinstance (x, int) for x alist)'로 쓰는 것이 낫습니다. 그러나 나는 이것이 이것이 요구되는 것이라고 생각하지 않는다. –

+0

네 말이 맞아. 내가 편집;) – Ant

2

당신이하려는 일에 달려 있습니다. 속도가 중요하지 않다면, 먼저를 사용하십시오. 문제가된다면 먼저 목록을 다른 데이터 구조 (예 : 말 목록의 항목을 자주 찾습니다), 크기 등으로 변환 할 수 있는지 여부에 따라 달라집니다.

아이디어를 제공하려면 :

import timeit 

a = range(10000) 
da = dict(zip(a, [None for i in a])) 

def list_first(): 
    return 0 in a 

def dict_first(): 
    return 0 in da 

def list_last(): 
    return 9999 in a 

def dict_last(): 
    return 9999 in da 

if __name__ == "__main__": 
    for f in ["list_first", "dict_first", "list_last", "dict_last"]: 
     t = timeit.Timer("%s()" % f, setup="from __main__ import %s" % f) 
     print min(t.repeat(number=10000)) 

이 저를 제공합니다

예상대로 물건을 빠르게하지 않는 DICT를 사용하여 목록의 시작 부분에있는 항목에 대한 보면
0.00302004814148 
0.00318598747253 
4.21943712234 
0.004145860672 

. 마지막에 항목을 찾으면 예상 한대로 차이가 매우 크게 나옵니다 (해독 가능). 목록은 하나씩 다른 항목을 찾아야합니다.

항목이 유사한 경우 시퀀스를 정렬하고 N 대신 log (N), log (N)을 N에 비해 상대적으로 빠른 비교적 빠른 속도로 정렬 할 수 있습니다. 파이썬의 경우 실제로 너무 큼) 또는 고급 구조 (바이너리 검색 트리 등)를 사용합니다. 꽤 복잡해질 수 있습니다 - 빠른 검색을위한 데이터 구조는 결국 CS에서 가장 많이 연구 된 문제 중 하나입니다.

+0

여기 dicts 대신 세트를 사용하여 코드의보다 간결한 버전입니다 : https://gist.github.com/742056. 특히'timeit.Timer'에 대한 생성자 호출은 약간 장황 해 보입니다 :) –

관련 문제