일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 백준
- redis
- Algorithm
- CS
- PYTHON
- db
- 운영체제
- CSS
- mysql
- BFS
- 트러블슈팅
- javascript
- 알고리즘
- It
- Docker
- java
- OS
- HTML
- 프로그래머스
- nosql
- 영속성 컨텍스트
- 데이터베이스
- spring
- DFS
- websocket
- jpa
- Data structure
- 트랜잭션
- 자료구조
- 완전탐색
- Today
- Total
If at first you don't succeed, try again
[Python] List Comprehension(리스트 컴프리헨션) 본문
* 개요
파이썬으로 코테, 자료구조, 알고리즘 공부를 진행하다보니, 리스트 선언의 중요성이 더욱 와닿는다는 것을 느꼈다. 오늘 소개할 List Comprehension(리스트 컴프리헨션)은 리스트를 초기화하는 방법 중 하나이다. 리스트 컴프리헨션은 간단히 0부터 19까지의 수 중에서 홀수만 포함하는 리스트를 만들고자 할 때는 다음과 같이 리스트를 초기화할 수 있다. 이 경우 한 줄의 소스코드로 리스트를 초기화할 수 있어 매우 간편하다.
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]
print(array) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
참고로 위 소스코드를 일반적인 소스코드로 작성하면 밑의 코드와 같다.
array = []
for i in range(20) :
if i % 2 == 1 :
array.append(i)
print(array)
리스트 컴프리헨션을 이용했을 때의 소스코드가 훨씬 짧고 간결한 것을 알 수 있다.
* 왜 리스트 컴프리헨션을 사용하는가?
리스트 컴프리헨션은 코딩 테스트에서 2차원 리스트를 초기화할 때 매우 효과적으로 사용될 수 있다. 코딩 테스트에서는 그래프 문제를 풀 때가 많은데(bfs, dfs, 백트래킹 등등..), 예를 들어 N × M 크기의 2차원 리스트를 초기화할 때는 다음과 같이 사용한다.
n = 3
m = 4
array = [[0] * m for _ in range(n)]
print(array) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
특정 크기의 2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용해야 한다. 만약에 다음과 같이 N × M 크기의 2차원 리스트를 초기화한다면, 의도하지 않은 결과가 나올 수 있다.
n = 3
m = 4
array = [[0] * m] * n
print(array) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
array[1][1] = 5
print(array) # [[0, 5, 0, 0], [0, 5, 0, 0], [0, 5, 0, 0]]
실행 결과를 확인해보면, array[1][1]의 값을 5로 바꾸었을 뿐인데, 3개의 리스트에서 인덱스 1에 해당하는 원소들의 값이 모두 5로 바뀐 것을 확인할 수 있다. 이는 내부적으로 포함된 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식되기 때문이다. 따라서 특정한 크기를 가지는 2차원 리스트를 초기화할 때는 리스트 컴프리헨션을 이용해야 한다.