과제도 과제지만 컴프리헨션에 대해 간단히 알아보고 간다. 구글 파이썬 스타일가이드에 너무 잘 정리되어 있다.
리스트, 딕셔너리, 세트 컴프리헨션은 전통적인 루프, map(), filter() 람다 등을 사용하지 않고도 컨테이너 타입과 이터레이터를 생성하는 간결하고 효율적인 방법이다.
보통의 방법으로 리스트, 딕셔너리, 세트를 생성하는 것 보다 컴프리헨션이 더 깔끔하고 간단하다.
조금만 복잡해지면 읽기 어렵다.
간단한 경우에는 사용해도 된다. 매핑 표현, for
문, 필터 표현을 모두 한 줄에 작성하는 것이 간단한 경우에 해당한다. 더 복잡해질 것 같으면 보통의 루프를 사용하는 것이 좋다.
아래는 파이썬 코딩도장에서 가져온 처리 순서이다. 가장 복잡한 예제로 가져왔다.
사전스터디때 파이썬 코딩도장에서 컴프리헨션에 대해서 공부한 적이 있다. 그래서 수월하게 풀었다 😎.
다음과 같은 도시목록의 리스트가 주어졌을때, 도시이름이 S로 시작하지 않는 도시만 리스트로 만들 때 리스트 컴프리헨션을 사용하여 함수를 작성해 보세요.
cities = ["Tokyo", "Shanghai", "Jakarta", "Seoul", "Guangzhou", "Beijing", "Karachi", "Shenzhen", "Delhi" ]
크게 설명할 내용은 없는 것 같다.
def no_cities_begins_with_S(cities):
return [city for city in cities if not str.startswith(city, 'S')]
print(no_cities_begins_with_S(cities))
>>> python assignment1.py
['Tokyo', 'Jakarta', 'Guangzhou', 'Beijing', 'Karachi', 'Delhi']
다음과 같은 도시, 인구수가 튜플의 리스트로 주어졌을때, 키가 도시, 값이 인구수인 딕셔너리를 딕셔너리 컴프리헨션을 사용한 함수를 작성해 보세요.
population_of_city = [(‘Tokyo', 36923000), (‘Shanghai', 34000000), (‘Jakarta', 30000000), (‘Seoul', 25514000), (‘Guangzhou', 25000000), (‘Beijing', 24900000), (‘Karachi', 24300000 ), ( ‘Shenzhen', 23300000), (‘Delhi', 21753486) ]
def convert_list_of_tuples_into_dict(list_of_tuples):
return {t[0]: t[1] for t in list_of_tuples}
print(convert_list_of_tuples_into_dict(population_of_city))
>>> python assignment2.py
{'Tokyo': 35923000, 'Shanghai': 34000000, 'Jakarta': 30000000, 'Seoul': 25514000, 'Guangzhou': 25000000, 'Beijing': 24900000, 'Karachi': 24300000, 'Shenzhen': 23300000, 'Delhi': 21753486}