TIL DAY.15 Python (list comprehension)

Dan·2020년 8월 26일
0

List Comprehension

리스트 컴프리헨션은 기존 리스트처럼 [] 대괄호를 사용하며, 다른 점은 for 루프와 if문을 조건문으로 포함 시킬 수 있는 형식을 갖고 있습니다.

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

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

리스트 컴프리헨션의 장점

-List comprehension을 통해 기존의 리스트 정의와 루프를 한번에 돌리며 코드를 좀 더 간결하게 만들 수 있습니다.

예1)

 new_list = [ x for x in range(1, 11) ]
print(new_list)

이 처럼 [1,2,3,4,5,6,7,8,9,10] 리스트를 간결한 표현으로 만들어 낼 수 있습니다.

예2) if문을 포함한 리스트 컴프리헨션

  • 리스트 컴프리헨션을 사용하지 않았을 때
odd_numbers = [ ]
for element in range(1,11):
    if (element % 2) == 1:
        odd_numbers.append(element)
  • 사용 했을 때
list_comprehension = [ element for element in range(1,11) if (element % 2) == 1 ]
print(list_comprehension)

이 처럼 4줄로 된 코드를 한줄로 쉽게 바꿀 수 있습니다.

리스트 컴프리헨션의 성능

다음 코드는 timeit모듈을 사용하여 함수들을 1000번 실행한 시간을 측정하는 코드 입니다. 실행하는 머신에 따라 다르겠지만 일반적인 랩탑환경에서는 0부터 999를 가지는 리스트를 만드는데 일반 for loop은 0.062밀리초 리스트컴프리헨션은 0.024밀리초로 이경우에는 일반적인 for loop보다 두배정도 더 빠르게 실행됨을 확인할 수 있습니다.

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")

for loop time = 0.062743696 milliseconds
list_comprehension time = 0.024242144999 milliseconds

  • 리스트 컴프리헨션으로 작성한 코드는 간결하고 데이터베이스를 조회하여 리스트로 만들 때 많이 사용되므로 리스트 컴프리 헨션은 새로운 배열을 만들때 특히 유용합니다.
  • 또한 성능개선을 위해서 사용되기도 하지만, 가독성을 위해서 여러 줄의 표현식과 조건문으로 표현하는 것이 리스트 컴프리헨션 한줄로 코딩하는 것 보다 나은 경우가 있습니다.

Assignments

1.다음과 같은 도시목록의 리스트가 주어졌을때, 도시이름이 S로 시작하지 않는 도시만 리스트로 만들 때 리스트 컴프리헨션을 사용하여 함수를 작성해 보세요.

cities = ["Tokyo", "Shanghai", "Jakarta", "Seoul", "Guangzhou", "Beijing", "Karachi", "Shenzhen", "Delhi" ]

Solution

##using list comprehension
cities = ['Tokyo','Shanghai','Jakarta',"Seoul","Guangzhou","Beijing","Karachi","Shenzhen","Delhi"]
new_cities = [s for s in cities if s[0] != 'S']
print(new_cities)

##Just using regular for loop
# for city in cities:
#     #  city = "Tokyo"
#     if city[0] != 'S':
#         # cities["Tokyo"]
#         new_cities.append(city)

2.다음과 같은 도시, 인구수가 튜플의 리스트로 주어졌을때, 키가 도시, 값이 인구수인 딕셔너리를 딕셔너리 컴프리헨션을 사용한 함수를 작성해 보세요.

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

Soultion2

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

my_dict = dict(population_of_city)
print(my_dict)

위와 같이 dict()를 활용한 쉬운 방법도 있지만 이번에 배운 list comprehension 을 사용해보자

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

new_dict = {x[0]:x[1] for x in population_of_city}
print(new_dict)
profile
만들고 싶은게 많은 개발자

0개의 댓글