새로운 빈 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]
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]
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안에 들어갈 요소까지 한번에 선언하면 더 효율적으로 코드를 짤 수 있다!
new_list = [expression **for** member **in** iterable]
expression ㅣ member 자체, method에 대한 호출 또는 value를 반환하는 어떤 식! 예제 코드에서 expression은 i * i
다.
member | list의 object 또는 iterable을 말한다. 예제 코드에서 member는 i
다.
iterable | list, set, sequence, generator, 또는 요소를 하나식 반환할 수 있는 어떤 객체.
expression 조건이 매우 유연하므로 map()을 써야할 때 잘 써먹을 수 있다. map()는 map 객체를 반환하지만 List Comprehension는 list를 반환한다.
왜 For문 대신 list comprehension을 써야할까??
1. 더 파이써닉하다
2. mapping, filtering 때 유용하게 쓸 수 있다.
3. 더 쉽게 읽히고 코드 가독성을 높힐 수 있다. loop는 list가 어떻게 만들어졌는지에 더 취중되어있다. 그러나 list comprehension은 list에 어떤 요소가 들어갈건지에 더 집중한다.
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]
>>> 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 안에 넣어야한다.
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)
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