Python - List Comprehension

신지원·2021년 4월 19일
0
post-thumbnail

프로젝트를 진행하니깐 list comprehension이 필요하게 되었다.

list comprehension

numbers = []
for n in range(1, 10+1):
    numbers.append(n)
    
====================
# list comprehension 이용한 모습
[x for x in range(10)]

리스트를 생성할때는 [ ] 를 사용하고, 딕셔너리 컴프리헨션 또는 셋 컴프리헨션 문법을 사용할때는 대괄호 { }를 사용

조건 달기

list comprehension에는 if를 사용할 수 있다.
if 키워드는 for문 뒤에 사용한다.

[ 2*x for x in range(1, 10+1) ]
#[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

[x for x in range(1, 10+1) if x % 2 == 0]
#[2, 4, 6, 8, 10]

중복

[ (x, y) for x in ['쌈밥', '치킨', '피자'] for y in ['사과', '아이스크림', '커피']]

'''
[('쌈밥', '사과'),
 ('쌈밥', '아이스크림'),
 ('쌈밥', '커피'),
 ('치킨', '사과'),
 ('치킨', '아이스크림'),
 ('치킨', '커피'),
 ('피자', '사과'),
 ('피자', '아이스크림'),
 ('피자', '커피')]
 '''
students = ['철수', '영희', '길동', '순희']
=========================================
# value 선언해줌..
{ student: 0 for student in students }
{'철수': 0, '영희': 0, '길동': 0, '순희': 0}

실제 응용한 모습..

class CategoryFilterView(View):
    def get(self, request, category_id=None):
            products = Product.objects.filter(sub_category__category__id=category_id)
            for product in products:
                product_images = product.productimage_set.all()
                for product_image in product_images:
                    result.append(
                        {
                            'id': product.id,
                            'name': product.name,
                            'image_url': product_image.image_url,
                            'price': product.get_price()['real_price'],
                            'discount_rate': product.discount_rate,
                            'original_price': product.original_price,
                        }
                    )
            return JsonResponse({'MESSAGE': result}, status=201)

지금은 list comprehension을 사용하지 않았을때 for을 중첩으로 돌려서 가독성이 떨어진다.

class CategoryFilterView(View):
    def get(self, request, category_id=None):
            products = Product.objects.filter(sub_category__category__id=category_id)
            for product in products:
            product_images = product.productimage_set.all()
            result = [{
                'id': product.id,
                'name': product.name,
                'image_url': [product_image.url for product_image in product_images],
                'price': product.get_price()['real_price'],
                'discount_rate': product.discount_rate,
                'original_price': product.original_price,
            } for product in products]
            return JsonResponse({'MESSAGE': result}, status=201)

이번엔 list comprehension을 사용해서 코드도 훨씬 간단해지고, 가독성도 좋아졌다.

0개의 댓글