ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python 2차원 리스트] 리스트 반복과 리스트 컴프리헨션의 차이
    Python/Grammar 2024. 3. 12. 13:55

     

     알고리즘 문제를 풀면서 '리스트 반복'과 '리스트 컴프리헨션'이 각각 어떻게 1차원 리스트로부터 2차원 리스트를 'copy'하는지 그 차이를 알게되었다.

    • 리스트 반복
      • 2차원 리스트 생성 방법: [[0] * m] * n
      • 1차원 리스트 '[[0] * m]' 를 'n'번 반복해서 2차원 리스트를 생성할 때 shallow copy를 수행함. 즉, 모든 행이 동일한 리스트 객체를 참조하게 되므로 한 행의 데이터를 변경하면 모든 행에 그 변경점이 반영됨.  

     

    • 리스트 컴프리헨션
      • 2차원 리스트 생성 방법: [[0] * m for _ in range(n)]
      • 'n'번만큼 for 문으로 '[0] * m'의 결과를 새로 생성하는 과정을 반복해서 2차원 리스트를 생성함. 각 반복마다 독립적인 리스트가 생성되기 때문에 deep copy의 효과를 가짐.

     

    문제

    n x m 크기의 2차원 격자가 두 개 주어지고, 새로운 2차원 격자를 만들려고 합니다.
    주어진 두 격자에서 같은 위치에 존재하는 숫자의 값이 같다면 0, 그렇지 않다면 1을 적어주려 합니다.
    새로운 2차원 격자를 만들어 이를 해결하는 프로그램을 작성해보세요.

     

     

    풀이

    n, m = map(int, input().split())
    first_grid = []
    second_grid = []
    new_grid = [[0] * m for _ in range(n)] # new_grid 초기값 설정
    
    for _ in range(n):
        first_grid.append(list(map(int, input().split())))
    for _ in range(n):
        second_grid.append(list(map(int, input().split())))
    
    for i in range(n):
        for j in range(m):
            if first_grid[i][j] != second_grid[i][j]:
                new_grid[i][j] = 1
    
    for row in new_grid:
        for col in row:
            print(col, end=" ")
        print()

     

    처음에는 2차원 리스트 new_grid를 할당할 때 리스트 반복으로 생성했더니 결과값이 이상했다. 2차원 리스트가 얕은 복사(shallow copy)되어서 한 행의 데이터 변경점이 다른 리트스에도 적용되었기 때문이다. 아래와 같이 리스트 반복으로 생성된 2차원 리스트의 각 요소의 주소는 모두 동일하다. 따라서 깊은 복사(deep copy)가 되는 리스트 컴프리헨션을 사용했다. 

     

     

    new_grid의 초기값 설정 없이 이런 식으로 해결할 수도 있다.

    n, m = map(int, input().split())
    first_grid = []
    second_grid = []
    for _ in range(n):
        first_grid.append(list(map(int, input().split())))
    for _ in range(n):
        second_grid.append(list(map(int, input().split())))
    
    new_grid = [
        [1 if arr_1[i][j] != arr_2[i][j] else 0 for j in range(m)]
        for i in range(n)
    ]
    
    for row in new_grid:
        for col in row:
            print(col, end=" ")
        print()

     

    댓글

Designed by Tistory.