List Comprehension

이번주 프로젝트를 진행하면서, 리스트 컴프리헨션을 써야 할 경우가 많았고 앞으로도 많을 것 같아 기억할 겸 포스팅을 올린다.

List Comprehension은 무엇이냐?

  • 리스트를 좀더 쉽게, 내 입맛대로 구성하기 위한 방법이다. 간단히 말하면 그렇고, 좀더 길게 설명하자면, 하나의 sequence에서 지정된 코드에 따라 새로운 리스트 컬렉션을 빌드하는것이다.
  • 개인적인 이야기를 덧붙이자면, 필자는 아직 초심자라 다소 길어지더라도 차근차근 진행되는 코드를 선호했었는데, 이번에 List Comprehension을 써보면서 코드가 이렇게나 짧고 가독성이 높아질 수 있다는걸 알게되면서, 파이썬의 매력에 점점 빠져드는 것 같다.

기본

  •   [새 리스트에 들어갔으면 하는 표현식 for x in y]
  • 좀더 구체적인 예를 들자면.... 만약 1-10사이의 숫자에서 짝수를 구한다고 가정해보자

      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을 사용할 수 있지만 나는 이번 프로젝트에서 아직 터득할 필요가 생기지 않아서 따로 써보지 않았다. 만약 써보게된다면 시리즈 포스팅으로 돌아올지도...