python을 python답게 코딩할 수 있는 comprehension을 자주 사용하면 좋겠죠?
이번 포스팅에서는 간단하게 Comprehension을 사용하는 팁에 대해서 알아보겠습니다.
1) 다수의 생성식 활용
: 아래와 같이 여러 변수에 대해서 comprehension을 적용할 수 있습니다.
r = ((y, x) for y in range(3) if not y%2 for x in range(3) if x%2)
for 및 if(필터링) 순서의 핵심 기준
- for 루프의 순서: 왼쪽에서 오른쪽으로 바깥쪽 루프(outer loop) -> 안쪽 루프(inner loop) 순서로 작성합니다.
- if 조건문의 위치: if 필터는 자신이 필터링하는 for 루프 바로 뒤에 위치해야 합니다.
2) 다차원 container 생성
: 아래 코드에서 이중 리스트를 만드는 예시처럼 comprehension을 활용하면 다차원 container를 만들 수 있습니다.
tt=[[1,2] for i in range(2)]
print(tt) #[[1, 2], [1, 2]]
여러 변수에 대한 생성식을 사용하는 것과 다차원의 생성식을 사용하는 것을 잘 구별해야 합니다. 예를 들어 다음 포스팅에서의 array 정규화 작업을 진행한 바 있는데요,
2025.10.21 - [프로그래밍/Lock] - [Python 기초] Array의 정규화
다루는 대상 array가 행, 열을 가진 2차원 array이기 때문에 만약 comprehension을 올바르게 사용하기 위해서는 아래와 같이 써야합니다.
[[(x-c_mean[i])/c_std[i] for x in row] for i, row in enumerate(arr_rpl)]
[(x-c_mean[i])/c_std[i] for x in row for i, row in enumerate(arr_rpl)] # 다차원을 쓰지 않게 되면 for 순서도 뒤죽박죽이 되고 에러가 발생
3) 조건절에서 if/else 사용하는 경우
: 사실 저도 종종 헷갈리는 syntax입니다. [조건만족시출력내용 if 조건 else 조건불만족시출력내용 for루프] 의 syntax를 적어주시면 됩니다.
[i**2 if i % 2 == 0 else i*3 for i in range(10)]
위에서 살펴본 for loop에서의 if 필터와 비교해서 차이점을 주목해주세요. if 필터일 때는 comprehension 구조의 for loop 바로 뒤에서 if가 등장했었지만 이렇게 if/else로 사용할 경우에는 for loop 앞에서 사용됩니다.
꼭 List에서만 comprehension을 사용하는 것도 아닙니다. Dictionary에서도 마찬가지로 Comprehension을 사용할 수 있습니다.
data = {'a': 1, 'b': 2, 'c': 1, 'd': 3}
# 값이 1인 딕셔너리만 추출
filtered = {k: v for k, v in data.items() if v == 1}
print(filtered) # {'a': 1, 'c': 1}
[{k: v} for k, v in data.items() if v == 1] # 아님 주의 comprehension으로 그냥 ,만 생략. 나머지는 원래 데이터타입과 동일
그냥 key, value 튜플 쌍으로 가져오고 싶으면 아래처럼 해도 됩니다.
filtered_list = [(k, v) for k, v in data.items() if v == 1]
print(filtered_list) # [('a', 1), ('c', 1)]
특히 이 경우는 filtered = dict(filtered_list) 명령어로 다시 Dictionary로 돌릴 수 있습니다.
'프로그래밍 > Python 관련 정보' 카테고리의 다른 글
| [Python Programming 기초] 부분 unpacking (3) | 2024.10.22 |
|---|---|
| [Python Programming 기초] Dictionary (3) | 2024.10.22 |
| [Python Programming 기초] Iterator (1) | 2024.10.20 |
| [Python Programming 기초] Container (0) | 2024.10.19 |
| [Python Programming 기초] Mutable/Immutable (1) | 2024.10.19 |