Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C언어
- RNN
- yarn
- tensorflow
- 파이썬
- recursion
- Java
- GRU
- Sort
- effective python
- scrapy
- 주식분석
- 선형대수
- hive
- 딥러닝
- 하이브
- python
- 코딩더매트릭스
- HelloWorld
- NumPy
- collections
- codingthematrix
- hadoop2
- 그래프이론
- LSTM
- 텐서플로
- 알고리즘
- C
- graph
- 하둡2
Archives
- Today
- Total
EXCELSIOR
BETTER WAY 8 - 리스트 컴프리헨션에서 표현식을 두 개 넘게 쓰지 말자 본문
Python/Effective Python
BETTER WAY 8 - 리스트 컴프리헨션에서 표현식을 두 개 넘게 쓰지 말자
Excelsior-JH 2018. 4. 19. 22:54Item08 - Avoid More Than Two Expressions in List Comprehensions
리스트 컴프리헨션은 기본 사용법(Better Way 7 참고) 뿐만 아니라 다중 루프도 지원한다.
# matrix를 리스트 하나로 표현하기
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row] # 왼쪽에서 오른쪽 순으로 실행
print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
# matrix의 각 행(셀)의 제곱을 구하기
squared = [[x**2 for x in row] for row in matrix]
print(squared)
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]
위의 예제들은 이중 루프를 사용했지만 이해하기는 어렵지 않다. 하지만 루프가 많아지게 되면 리스트 컴프리헨션을 여러 줄로 구분해야 할 정도로 길어진다.
my_lists = [
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]
]
flat = [x for sublist1 in my_lists
for sublist2 in sublist1
for x in sublist2]
print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
위의 예제 처럼 리스트 컴프리헨션 또한 짧지는 않다는 것을 알 수 있다. <br />이번엔 일반 루프문으로 만들어 보도록 한다. 이 방법이 들여쓰기를 사용해 오히려 리스트 컴프리헨션 보다 이해가 쉽다.
flat = []
for sublist1 in my_lists:
for sublist2 in sublist1:
flat.extend(sublist2)
print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
리스트 컴프리헨션은 다중 if
문도 지원한다. 같은 루프 레벨에 여러 조건이 있으면 암시적으로 and
표현식이 된다.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x for x in a if x > 4 if x % 2 == 0]
c = [x for x in a if x > 4 and x % 2 == 0]
assert b == c
print(b)
print(c)
[6, 8, 10]
[6, 8, 10]
조건은 루프의 각 레벨에서 for
표현식 뒤에 설정할 수 있다.
# 행렬에서 행(row)의 합이 10 이상이고 3으로 나누어 떨어지는 셀을 구하기
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
filtered = [[x for x in row if x % 3 == 0]
for row in matrix if sum(row) >= 10]
print(filtered)
[[6], [9]]
위의 예제 처럼 다중 루프에 다중 조건이 들어가게 되면 리스트 컴프리헨션을 이해 하기는 어려워 진다.교재에서는 조건 두 개, 루프 두 개, 혹은 조건 한 개와 루프 한 개 정도는 리스트 컴프리헨션을 사용하고 그 이상은 일반적인 if 문과 for문을 사용하는 것이 좋다고 한다.
정리
리스트 컴프리헨션은 다중 루프와 루프 레벨별 다중 조건을 지원한다.
표현식이 두 개가 넘게 들어 있는 리스트 컴프리헨션은 이해하기 어려우므로 피해햐 한다.
'Python > Effective Python' 카테고리의 다른 글
BETTER WAY 7 - map과 filter 대신 리스트 컴프리헨션을 사용하자 (0) | 2018.02.23 |
---|---|
BETTER WAY 6 - 한 슬라이스에 start, end, stride를 함께 쓰지 말자 (0) | 2018.01.29 |
BETTER WAY 5 - 시퀀스를 슬라이스하는 방법을 알자 (0) | 2018.01.29 |
BETTER WAY 4 - 복잡한 표현식 대신 헬퍼(Helper) 함수를 작성하자 (0) | 2018.01.29 |
BETTER WAY 03 - bytes, str, unicode의 차이점을 알자 (0) | 2018.01.22 |
Comments