2차원 리스트에서의 한 행씩 돌면서 전체적으로 2차원 배열에 10이라는 값이 있는지 검사하려한다.
일반적으로 리스트 내 숫자가 있는지 확인하는 if num not in [7,8,9,10]
이라면 당연히 잘 돌아갈테니, [1,2,3]과 [4,5,6]을 거쳐 세번째 행에서 정상적으로 10을 잘 찾지 않을까?
결과는..?
찾을 수 없다!
그 이유는 무엇일까?
리스트의 반복을 사용했으므로 if num in (list [1],[2],[3])
가 될거라 생각했지만 실상은 그렇지 않다.
if if num not in ([1, 2, 3], [4, 5, 6], [7, 8, 9, 10])
로 돌아가기 때문이다.
즉, 리스트 자체와 num값을 비교하게 된다.
num = 10 일때,
num = [1,2,3] ❌
num = [4,5,6] ❌
num = [7,8,9,10] ❌
당연히 같지 않으므로 해당 2차원 리스트에는 10이라는 값이 없는 결과가 나온다.
그렇다면 어떻게해야 2차원 리스트에 내에 10이라는 값이 있는지 알 수 있을까?
다음과 같이 소스코드를 쓰면 된다.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
# 10이 배열 내에 없는지 확인
num = 10
if num not in (s_num for row in matrix for s_num in row):
print("10은 배열 내에 없습니다.")
else:
print("10은 배열 내에 있습니다.")
소스코드가 좀 복잡해보이지만, 그냥 이렇구나하고 이해해보자. 그게 답이다.
중간에 for row in matrix
부터 보자. matrix를 돌며 각각의 행을 추출한다.
여기까지는 기존 소스코드랑 같다.
그리고 바로 뒤에 for s_num in row
를 보자.
1번에서 구한 각각의 행에서 정확한 숫자까지 접근하여 추출한다.
추출된 이 숫자는 s_num
로 찾으려는 각각의 행렬 내 요소 값이다.
최종적으로 맨 앞에 s_num
를 써줌으로써, 아래와 같은 형태로 2차원 리스트 내 num이라는 값이 있는 지 비교하게 된다.
if if num not in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
이렇게하면 num이 2차원 리스트 내 정상적으로 있다는 것을 판별할 수 있다.