이 포스트에서는 파이썬에 쓰이는 연산자 중 유용한 연산자 in을 소개합니다.
in은 멤버 연산자입니다. 어떤 배열이 있을 때 그 배열에 특정한 값이 있는가를 찾아서 그 값이 있으면 True(참)를, 없으면 False(거짓)를 돌려줍니다. 다음 코드를 봅시다.
a = [1, 2, 3] print(1 in a) print(4 in a) print(1 not in a) print(4 not in a)
이 코드의 실행 결과는 다음과 같습니다.
True False False True
먼저 1번 줄에서 1, 2, 3을 각각의 값으로 갖는 배열 a를 정의하고 2번 줄에서는 1이 a 안에 포함되어 있는가의 여부를 출력, 3번 줄에서는 4가 a 안에 포함되어 있는가의 여부를 출력합니다. 1은 a 안에 포함되어 있으므로 True를 출력하고, 4는 a 안에 포함되어 있지 않으므로 False를 출력합니다.
4번 줄과 5번 줄에서는 not in
으로 되어 있는데, 이는 in과는 반대로 그 배열에 특정한 값이 없어야 True를 돌려주고 있으면 False를 돌려줍니다. 이 예제에서는 1이 a 안에 포함되어 있으므로 1 not in a
는 False, 4는 a 안에 포함되어 있지 않으므로 4 not in a
는 True가 되는 것입니다.
그러면, 다음의 경우도 봅시다.
a = [1, 2.0, "3"] print(1 in a) print(2 in a) print(3 in a)
이 코드의 실행 결과는 다음과 같습니다.
True True False
앞의 예제와 다른 점은 1, 2, 3의 자료형이 다르다는 점입니다. 1은 그냥 정수, 2는 소수형으로 된 정수, 3은 문자열화된 정수로 되어 있습니다. 그런데 2번 줄부터 4번 줄까지를 보면 세 개 모두 정수로 in a를 하였습니다. 그 결과 1과 2에 대해서는 True가 출력되고 3에 대해서는 False가 출력되었습니다. 이는 정수와 소수화된 정수는 실제 값이 같으면 같은 값으로 취급하기 때문입니다. 즉, 2(int)와 2.0(float)은 자료형은 다르지만 실제 값이 같기 때문에 같은 값으로 취급되는 것입니다. 자료형은 다르지만 어쨌든 그 값이 있기 때문에 포함되어 있는 것으로 판정해서 True를 돌려주는 것입니다.
반면, 정수와 문자열화된 정수는 실제 값이 같더라도 다른 값으로 취급됩니다. 즉, 3(int)과 “3”(str)은 실제 값은 같지만 다른 값으로 취급됩니다. 그렇기 때문에 이 예제에서는 “3”(str)이 배열 안에 있지만 3(int)과는 다르게 취급하여 3이 포함되어 있지 않은 것으로 판정해서 False를 돌려줍니다.
또 다른 예를 봅시다.
a = [1, [2], [3, 4] ] print(1 in a) print(2 in a) print(3 in a) print([1] in a) print([2] in a) print(3 in a[2])
이 코드의 실행 결과는 다음과 같습니다.
True False False False True True
이 예제와 같이 배열 안에 배열이 들어 있는 경우, 배열 안의 배열에서 값을 찾는 것이 아니라 배열 안의 배열 그 자체를 하나의 원소로 취급하게 됩니다. 즉, a 안에 [2](list)와 [3, 4](list)가 있고 그 안에 각각 2와 3이 있지만 a 안에 있는 배열 자체를 하나의 원소로 취급하기 때문에 2(int)는 [2](list)와 다른 것으로 취급하고 3(int) 역시 [3, 4](list)와 다른 것으로 취급하여 False를 돌려줍니다.
반대로, 5번 줄과 6번 줄처럼 [1]과 [2]를 각각 찾는 경우 a 안에 1(int)은 있지만 [1](list)은 없으므로 False, [2](list)가 있으므로 True를 돌려줍니다. 또한, 7번 줄처럼 배열 안의 배열에서 값을 찾는 것도 가능한데, 4번 줄에서는 3을 a 안에서 찾지만 7번 줄에서는 3을 a 안의 [3, 4] 안에서 찾습니다. 당연히 [3, 4] 안에 3이 있으므로 7번 줄은 True를 돌려줍니다.