[python] 2차원 리스트에서의 in 사용

vinca·2023년 9월 23일
0
post-thumbnail

2차원 리스트에서의 in을 사용한 검사

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은 배열 내에 있습니다.")

소스코드가 좀 복잡해보이지만, 그냥 이렇구나하고 이해해보자. 그게 답이다.

  1. 중간에 for row in matrix부터 보자. matrix를 돌며 각각의 행을 추출한다.
    여기까지는 기존 소스코드랑 같다.

  2. 그리고 바로 뒤에 for s_num in row를 보자.
    1번에서 구한 각각의 행에서 정확한 숫자까지 접근하여 추출한다.
    추출된 이 숫자는 s_num로 찾으려는 각각의 행렬 내 요소 값이다.

  3. 최종적으로 맨 앞에 s_num를 써줌으로써, 아래와 같은 형태로 2차원 리스트 내 num이라는 값이 있는 지 비교하게 된다.

if if num not in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

이렇게하면 num이 2차원 리스트 내 정상적으로 있다는 것을 판별할 수 있다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글

관련 채용 정보