본문 바로가기

유용 노트

[python] 헷갈리는 list comprehension, 자주 실수하는 dict

코딩테스트 문제를 풀다보면 list comprehension 문을 자주 사용하는데 조건문과 섞어 쓰다보면 오류가 날 때가 있다.

if문만 쓸 때와 if, else 구문 쓸 때 오는 위치가 달라진다. 또 dict 다룰 때 내가 자주 실수하는 것 정리 !

코드로 알아보자.


첫 번째 : dict 할 때 실수

id_list = ["muzi", "frodo", "apeach", "neo"]

# dict.fromkeys로 dict를 만들 때
d_num = dict.fromkeys(id_list, 0)
d_list = dict.fromkeys(id_list, [])

d_num['muzi'] += 1        # {'muzi': 1, 'frodo': 0, 'apeach': 0, 'neo': 0}
d_list['muzi'].append(1)  # {'muzi': [1], 'frodo': [1], 'apeach': [1], 'neo': [1]}

# 그래프 만들 때 [[]] * 10 만들면 안되는 것 처럼 사전도 마찬가지 [[] for _ in range(n)] 사용
# d_list = dict(zip(id_list, [[] for _ in range(n)])

두 번째 : list comprehension. for문과 if문 같이 쓸 때

#### if문만 쓰는 경우
[k if v >= 2 for k,v in rtd_dict.items()] # SyntaxError
[k for k,v in rtd_dict.items() if v >=2 ] # 구문 마지막에 써야 정상 #

#### if, else 쓰는 경우
[k if v >= 2 else 1 for k,v in rtd_dict.items()] # 앞에 써야 정상
[k for k,v in rtd_dict.items() if v >= 2 else 1] # SyntaxError

#### 이중 조건 주는 경우
## and 조건 시 ans 없이
arr = [n for n in range(1, 31) if n % 2 == 0 if n % 3 == 0] # [6, 12, 18, 24, 30]
arr = [n for n in range(1, 31) if n % 2 == 0 and if n % 3 == 0] # 오류

## or 조건 시 or 써야함
arr = [n for n in range(1, 16) if n % 2 == 0 or n % 3 == 0] # [2, 3, 4, 6, 8, 9, 10, 12, 14, 15]

'유용 노트' 카테고리의 다른 글

[python] 정규식 정리 (re) - 스크랩  (0) 2022.05.06
[python] yield  (0) 2022.05.04
model.eval() 과 with torch.no_grad() 차이  (0) 2022.04.05
Imbalanced data 다루기  (0) 2022.03.17