-
[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()
'Python > Grammar' 카테고리의 다른 글
회문 판별과 N-gram 만들기 (0) 2023.03.25 15. 제너레이터 사용하기 (0) 2023.03.11 12. elif를 사용하여 여러 방향으로 분기하기 (0) 2023.03.10 11. else를 사용하여 두 방향으로 분기하기 (0) 2023.03.09 13. 반복문 제어하기 (0) 2022.12.08 - 리스트 반복