Python: list comprehension (리스트 표현식)

dev-swd·2020년 10월 25일
0

python

목록 보기
9/23
post-thumbnail

리스트 표현식

문법

  • [식 for 변수 in 리스트]
  • list(식 for 변수 in 리스트)
  • [식 for 변수 in 리스트 if 조건식]
  • list(식 for 변수 in 리스트 if 조건식)
new_list = [ x for x in range(1, 11) ]
print(new_list)
  • 두 가지의 표현식 중 대괄호를 사용하는 방식이 성능이 더 좋다.
a = [i * j for j in range(2, 10)
           for i in range(1, 10)]
  • 이중 for loop 를 만들 수도 있다.
  • 리스트 표현식에 for가 여러 개일 때 처리 순서는 뒤에서 앞으로 순이다.

언제 사용할까

  • 코드가 간결하고, 데이터베이스를 조회하여 리스트로 만들 때 많이 사용되므로 새로운 배열을 만들 때 유용하다.
  • 성능개선을 위해서 사용하기도 하지만, 모든 상황에서 좋은 것은 아니다 (코드의 가독성을 위해서는 여러 줄의 표현식과 조건문으로 표현하는 것이 더 좋다.)

표현식 문제1.

1. 도시이름이 S로 시작하지 않는 도시만 리스트로 만들 때 리스트 컴프리헨션을 사용하여 함수를 작성해 보세요.

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

new_cities = [i for i in cities if i[0] != "S" and i[0] != "s"]

# 실행 결과
['Tokyo', 'Jakarta', 'Guangzhou', 'Beijing', 'Karachi', 'Delhi']
  • 소문자 s 가 있을 확률도 고려하여 "S", "s" 둘 다 비교. 단, "S" 를 먼저 체크하여, 바로 조건문이 끝나도록 하였다.

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

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

population_of_city_dict = \
    {key: value for key, value in dict(zip(
        [key[0] for key in population_of_city],
        [key[1] for key in population_of_city]))
        .items()}

# 실행 결과
{'Tokyo': 36923000, 'Shanghai': 34000000, 'Jakarta': 30000000, 'Seoul': 25514000, 'Guangzhou': 25000000, 'Beijing': 24900000, 'Karachi': 24300000, 'Shenzhen': 23300000, 'Delhi': 21753486}

이건 빌드업이 좀 필요했는데, 딕셔너리 표현식이 결국은 딕셔너리를 기반으로 작동되었다.

  • {키: 값 for 키, 값 in 딕셔너리}
  • dict({키: 값 for 키, 값 in 딕셔너리})

그래서, 키가 되는 리스크와, 값이 되는 리스트를 만들어주는 작업을 먼저하여, 딕셔너리 표현식에 대체하였다.



파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide#273-cons

profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글