파이썬의 목록에 무언가가 없는지 어떻게 확인합니까?
가장 저렴하고 읽기 쉬운 솔루션은 in
연산자 (또는 특정 경우 not in
)를 사용하는 것입니다. 설명서에서 언급했듯이
운영자 in
및 not in
회원 자격 테스트 x in s
로 평가
True
하는 경우 x
의 구성원 s
, 그리고 False
그렇지. x not in s
의 부정을 반환합니다 x in s
.
또한
연산자 not in
는의 참 값을 갖도록 정의됩니다 in
.
y not in x
논리적으로와 같습니다 not y in x
.
다음은 몇 가지 예입니다.
'a' in [1, 2, 3]
# False
'c' in ['a', 'b', 'c']
# True
'a' not in [1, 2, 3]
# True
'c' not in ['a', 'b', 'c']
# False
튜플은 해시 가능하기 때문에 튜플과 함께 작동합니다 (튜플도 불변이기 때문에).
(1, 2) in [(3, 4), (1, 2)]
# True
RHS의 객체가 __contains__()
메소드를 정의하는 경우 문서 비교 섹션의 in
마지막 단락에 언급 된대로 내부적 으로 메소드를 호출합니다 .
... in
와 not in
, 반복 가능한이다 또는 구현 유형을 지원하는
__contains__()
방법을. 예를 들어, 당신은 이것을 할 수 있지만 그렇게해서는 안됩니다 :
[3, 2, 1].__contains__(1)
# True
in
단락이 있으므로 요소가 목록의 시작 부분에 있으면 in
더 빨리 평가됩니다.
lst = list(range(10001))
%timeit 1 in lst
%timeit 10000 in lst # Expected to take longer time.
68.9 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
178 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
항목이 목록에 있는지 확인하는 것 이상을 수행하려면 옵션이 있습니다.
list.index
항목의 색인을 검색하는 데 사용할 수 있습니다. 해당 요소가 없으면 a ValueError
가 발생합니다.
list.count
발생 횟수를 계산하려는 경우 사용할 수 있습니다.
XY 문제 : 당신은 set
s 를 고려 했습니까 ?
다음과 같은 질문을 해보십시오.
- 항목이 목록에 두 번 이상 있는지 확인해야합니까?
- 이 검사는 루프 또는 반복적으로 호출되는 함수 내에서 수행됩니까?
- 목록에 저장 한 항목이 해시 가능합니까? IOW, 당신
hash
은 그들 에게 전화 할 수 있습니까?
이 질문에 "예"라고 대답 한 경우 set
대신 사용하십시오 . 의 in
멤버쉽 테스트 list
는 O (n) 시간 복잡성입니다. 이것은 파이썬이 목록의 선형 스캔을 수행하여 각 요소를 방문하고 검색 항목과 비교해야한다는 것을 의미합니다. 이 작업을 반복적으로 수행하거나 목록이 크면이 작업에 오버 헤드가 발생합니다.
set
반면에 객체는 일정한 시간 멤버쉽 확인을 위해 값을 해시합니다. 확인은 다음을 사용하여 수행됩니다 in
.
1 in {1, 2, 3}
# True
'a' not in {'a', 'b', 'c'}
# False
(1, 2) in {('a', 'c'), (1, 2)}
# True
불행히도 검색 / 검색하지 않는 요소가 목록의 끝에있을 때 파이썬은 목록을 끝까지 스캔합니다. 이것은 아래의 타이밍에서 분명합니다.
l = list(range(100001))
s = set(l)
%timeit 100000 in l
%timeit 100000 in s
2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
기억하고, 이것은 저장하고 조회하는 요소가 해시 가능한 한 적합한 옵션입니다. IOW는 불변 유형이거나 구현하는 객체 여야합니다 __hash__
.
3 -1 > 0 and (4-1 , 5) not in []
⤇True
따라서 오류 운영자 우선 아니다.