TIL #59 : [Python] List Comprehension으로 코드 가독성 높이기

셀레스틴 허·2021년 2월 7일
2
post-thumbnail

파이썬에서 list를 만드는 법(3가지)

1. For문

새로운 빈 list를 만들고 for문을 돌려서 값을 빈 list에 append 한다.

>>> squares = []
>>> for i in range(10):
...     squares.append(i * i)
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2. map()함수

map()함수를 활용해 함수와 iterable로 묶어서 값을 얻는 방법.

>>> txns = [1.09, 23.56, 57.84, 4.56, 6.78]
>>> TAX_RATE = .08
>>> def get_price_with_tax(txn):
...     return txn * (1 + TAX_RATE)
>>> final_prices = map(get_price_with_tax, txns)
>>> list(final_prices)
[1.1772000000000002, 25.4448, 62.467200000000005, 4.9248, 7.322400000000001]

3. List Comprehension

List Comprehension으로 For문에서 썼던 예제 코드를 한줄로 요약할 수 있다!

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

빈 list를 만들고 거기에 요소 하나하나 집어넣기 보다... list 및 list안에 들어갈 요소까지 한번에 선언하면 더 효율적으로 코드를 짤 수 있다!

List Comprehension 기본 구조

new_list = [expression **for** member **in** iterable]
  1. expression ㅣ member 자체, method에 대한 호출 또는 value를 반환하는 어떤 식! 예제 코드에서 expression은 i * i다.

  2. member | list의 object 또는 iterable을 말한다. 예제 코드에서 member는 i다.

  3. iterable | list, set, sequence, generator, 또는 요소를 하나식 반환할 수 있는 어떤 객체.

expression 조건이 매우 유연하므로 map()을 써야할 때 잘 써먹을 수 있다. map()는 map 객체를 반환하지만 List Comprehension는 list를 반환한다.

For loop vs List Comprehension

왜 For문 대신 list comprehension을 써야할까??
1. 더 파이써닉하다
2. mapping, filtering 때 유용하게 쓸 수 있다.
3. 더 쉽게 읽히고 코드 가독성을 높힐 수 있다. loop는 list가 어떻게 만들어졌는지에 더 취중되어있다. 그러나 list comprehension은 list에 어떤 요소가 들어갈건지에 더 집중한다.

본격 List Comprehension

조건문 有 List Comprehension

구조

new_list = [expression for member in iterable (if conditional)]

예제 코드 (vowel이 아닌 char를 다 filter한다):

>>> sentence = 'the rocket came back from mars'
>>> vowels = [i for i in sentence if i in 'aeiou']
>>> vowels
['e', 'o', 'e', 'a', 'e', 'a', 'o', 'a']

만약 더 복잡한 조건문을 적용해야 한다면 함수로 만들어, 그 함수를 인자와 함께 list comprehension 안에 넣는 것도 방법이다!

>>> sentence = 'The rocket, who was named Ted, came back \
... from Mars because he missed his friends.'
>>> def is_consonant(letter):
...     vowels = 'aeiou'
...     return letter.isalpha() and letter.lower() not in vowels
>>> consonants = [i for i in sentence if is_consonant(i)]
['T', 'h', 'r', 'c', 'k', 't', 'w', 'h', 'w', 's', 'n', 'm', 'd', \
'T', 'd', 'c', 'm', 'b', 'c', 'k', 'f', 'r', 'm', 'M', 'r', 's', 'b', \
'c', 's', 'h', 'm', 's', 's', 'd', 'h', 's', 'f', 'r', 'n', 'd', 's']

위 코드에서 is_consonant()이라는 함수를 만들고, 이 함수를 조건문으로 list comprehension 안에 넣었다. 여기서 member로 value i도 같이 넣어야 한다!

만약 member value를 filter가 아니라 바꾸고(change) 싶다면? 이럴 때는 if 조건문을 앞에 붙이는게 더 이상적이다.

new_list = [expression (if conditional) for member in iterable]

TMI) Dictionary Comprehension 구현하기

구조

>>> squares = {i: i * i for i in range(10)}
>>> squares
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

딕셔너리를 만들기 위해서는 {}와 key-value 쌍을 expression 안에 넣어야한다.

Django에서 List Comprehension 쓰기

일반 for문을 쓴 코드 :

def get(self, request):
        products      = Product.objects.all()
        product_list  = []
        for product in products:
            product_list.append(
                {
                    "english_name" : product.english_name,
                    "category"     : product.category.name,
                    "korean_name"  : product.korean_name,
                    "description"  : product.description,
                    "allergy"      : product.allergy,
                }
            )
        return JsonResponse({"data" : product_list}, status=201)

List Comprehension 코드로 바꾸기 :

def get(self, request):
        products      = Product.objects.all()
        product_list  = 
        [
            {
                    "english_name" : product.english_name,
                    "category"     : product.category.name,
                    "korean_name"  : product.korean_name,
                    "description"  : product.description,
                    "allergy"      : product.allergy,
            } 
        for product in products]
        return JsonResponse({"data" : product_list}, status=201)

Django에서도 고효율, 고단백, 가독성 높은 코드를 구현할 수 있다.

Reference:
https://realpython.com/list-comprehension-python/
https://www.programiz.com/python-programming/list-comprehension

profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글