Advanced Python #1 List Comprehensions

강두연·2020년 11월 2일
0

Advanced Python

목록 보기
1/2
post-thumbnail

리스트 컴프리헨션이란?

새로운 리스트를 만들 때 사용하는 간단한(?) 표현식으로 리스트와 마찬가지로 대괄호([])를 사용하여 선언한다.

우리가 만드려고 하는 원소를 표현하는 표현식으로 시작하여 for loop이 뒤에 따라오는 형식을 가진다. For문 뒤에 if문을 추가하여 조건문을 포함한 형식도 가능하다.

전체적인 모양은 아래와 같다.

[표현식 for 원소 in 반복 가능한 객체]
[표현식 for 원소 in 반복 가능한 객체 if 조건]

간단한 예제를 보자.

#1부터 10까지의 수를 저장하는 리스트 만들기
new_list = [x for x in range(1, 11)
print(new_list)

#------------result------------#
#>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


#1부터 10까지 홀수인 수를 저장하는 리스트 만들기

#일반적인 방식
odd_numbers = []
for number in range(1,11):
	if number % 2 == 1:
    	odd_numbers.append(number)
        
#리스트 컴프리헨션을 이용한 방식
odd_numbers_comprehension = [number for number in range(1,11) if number % 2 == 1]
print(odd_numbers_comprehension)


#-----------result------------#
#>>> [1, 3, 5, 7, 9]

파이썬을 배우다가 리스트 컴프리헨션을 처음 접했을 때는 이게 무슨 괴랄한 문법인가... 싶었지만 원리를 내 나름대로 정리해보고 나니 훨씬 간단하고 쉽다는 것을 알게되었다.

내가 이해한 원리는 for문을 돌리면서 loop마다 할당되는 값을 제일 앞에 지정해주면 그 값들이 리스트의 원소로 자동으로 저장하는 원리이다. (뒤에 if문은 추가적인 요소)

리스트 컴프리헨션의 성능

파이썬의 'timeit'모듈을 사용하여 함수들을 1000번 실행한 시간을 측정해보자.

import timeit

def for_loop():
num_list = []
for i in range(1000):
num_list.append(i)

def list_comprehension():
num_list = [ i for i in range(1000) ]

if __name__ == "__main__":
time1 = timeit.Timer("for_loop()", "from __main__ import for_loop")
print("for loop time = ", time1.timeit(number=1000), "milliseconds")

time2 = timeit.Timer("list_comprehension()", "from __main__ import list_comprehension")
print("list_comprehension time = ", time2.timeit(number=1000), "milliseconds")

#----------result----------#
#for loop time =  0.065861356 milliseconds
#list_comprehension time =  0.035998514999999995 milliseconds

위와 같이 기계마다 정확한 시간은 다르겠지만 일반적인 for loop보다 리스트 컴프리헨션이 두배정도 더 빠르게 실행되는것을 확인할 수 있다.

리스트 컴프리헨션을 사용하는 이유

리스트 컴프리헨션으로 작성한 코드는 간결하고 데이터베이스를 조회하여 리스트로 만들 때 많이 사용된다.

하지만, 성능개선을 하기위해서 리스트 컴프리헨션을 사용하기도 하지만 모든 상황에서 만능은 아니다. 예를 들어 코드의 가독성을 위해서는 여러 줄의 표현식과 조건문으로 표현하는 것이 이중 for문의 복잡한 리스트 컴프리헨션 한줄로 코딩하는 것보다 나은 경우도 있다.

리스트 컴프리헨션의 장점과 단점을 보려면 해당 사이트에 방문해보는 것을 추천한다.
🐶 https://google.github.io/styleguide/pyguide#273-cons



리스트 컴프리헨션 연습하기

  1. 다음과 같은 도시목록의 리스트가 주어졌을때, 도시이름이 S로 시작하지 않는 도시만 리스트로 만들 때 리스트 컴프리헨션을 사용하여 함수를 작성해 보세요.
cities = ["Tokyo", "Shanghai", "Jakarta", "Seoul", "Guangzhou", "Beijing", "Karachi", "Shenzhen", "Delhi" ]
  1. 다음과 같은 도시, 인구수가 튜플의 리스트로 주어졌을때, 키가 도시, 값이 인구수인 딕셔너리를 딕셔너리 컴프리헨션을 사용한 함수를 작성해 보세요.
population_of_city = [(‘Tokyo', 36923000), (‘Shanghai', 34000000), (‘Jakarta', 30000000), (‘Seoul', 25514000), (‘Guangzhou', 25000000), (‘Beijing', 24900000), (‘Karachi', 24300000 ), ( ‘Shenzhen', 23300000), (‘Delhi', 21753486) ]

🔮 Answer
<
Quiz 1
cities = ["Tokyo", "Shanghai", "Jakarta", "Seoul", "Guangzhou", "Beijing", "Karachi", "Shenzhen", "Delhi"]
s = [city for city in cities if city[0] == 'S']

print(s)

#Quiz 2
population_of_city = [("Tokyo", 36923000), ("Shanghai", 34000000), ("Jakarta", 30000000), ("Seoul", 25514000), ("Guangzhou", 25000000), 
("Beijing", 24900000), ("Karachi", 24300000), ("Shenzhen", 23300000), ("Delhi", 21753486)]

dict_of_city = [{city : population} for (city, population) in population_of_city]
print(dict_of_city)


#---------result---------#
['Shanghai', 'Seoul', 'Shenzhen']
[{'Tokyo': 36923000}, {'Shanghai': 34000000}, {'Jakarta': 30000000}, {'Seoul': 25514000}, {'Guangzhou': 25000000}, {'Beijing': 24900000}, {'Karachi': 24300000}, {'Shenzhen': 23300000}, {'Delhi': 21753486}]
profile
Work hard, Play hard

0개의 댓글