이번주 프로젝트를 진행하면서, 리스트 컴프리헨션을 써야 할 경우가 많았고 앞으로도 많을 것 같아 기억할 겸 포스팅을 올린다.
[새 리스트에 들어갔으면 하는 표현식 for x in y]
- 좀더 구체적인 예를 들자면.... 만약 1-10사이의 숫자에서 짝수를 구한다고 가정해보자
```python
evens = []
for n in range(1,11):
if n%2 == 0:
evens.append(n)
리스트 컴프리헨션을 쓰지 않으면 이렇게 표현되어야 하는 코드가 리스트 컴프리헨션을 쓰는 순간
evens= [evens.append(n) for n in range(1,11) if n%2 ==0]
이런 한줄짜리 코드로 변해버린다.....(허망...)
class ListView(View):
def get(self, request):
data = list(Champ_Info.objects.all().values())
result_data = [{
"CHAMPION_ID" : champ["id"],
"CHAMPION_IMG" : [
{
"LOADING_IMG" : champ["loading_img"],
"SKIN_SPLASHES" : [
champ["splash_origin"],
champ["splash_skin1"],
champ["splash_skin2"],
champ["splash_skin3"],
champ["splash_skin4"],
champ["splash_skin5"],
champ["splash_skin6"],
champ["splash_skin7"],
champ["splash_skin8"],
champ["splash_skin9"],
],
},
],
"CHAMPION_NAME" : champ["name"],
"CHAMPION_EN_NAME" : champ["name_english"],
"CHAMPION_LINE" : champ["line"],
"CHAMPION_STORY" : champ["story"],
} for champ in data]
return JsonResponse({"champ_info_data" : result_data}, status=200)
```
위의 코드에서 불러오는 db에는 해당 lol 챔피언의 아이콘과 정보등등이 38개의 컬럼으로 이루어져 있다. 이를 전부 프론트로 뭉뚱그려 던져줬다가는 프론트엔드 개발자가 거의 날것에 가까운 데이터를 다시 가공해야하는 수고스러움과, 꺼내주지 않아도 되는 데이터를 꺼내서 통신하게되는 비효율이 있다. 이 때문에 사전에 상호 합의한 데이터 형태를 그려놓고, 저걸 쿼리셋 리스트를 돌아가면서 뽑아서 새로운 리스트로 보내줄 수 있도록 list comprehension으로 구현했다.
### dict comprehension, set comprehension
- 사실 comprehension은 list에만 존재하는건 아니다.dictionary나 set에서도 comprehension을 사용할 수 있지만 나는 이번 프로젝트에서 아직 터득할 필요가 생기지 않아서 따로 써보지 않았다. 만약 써보게된다면 시리즈 포스팅으로 돌아올지도...