본문 바로가기

프로그래머/Python

[널널한 교수의 고급 파이썬] 02-1, 02-2 리스트 축약 표현

02-1, 02-2 리스트 축약 표현

리스트 축약

  • 반복 가능 객체를 이용하여 쉽게 리스트를 생성할 수 있는 기능
  • map, filter 기능 구현 가능
  • 람다식의 본체가 될 식을 그대로 사용하기 때문에 따로 람다함수를 정의할 필요가 없다
  • 리스트 뿐만 아니라 집합과 같은 반복가능한 모든 객체에 대해 적용할 수 있다

리스트 축약의 문법

[{표현식} for {변수} in {반복자/연속열} if {조건표현식}]

예제

[x for x in range(10)]
[x ** 2 for x in range(10)]

a = [1, 2, 3, 4, 5, 6, 7]
# 맵과 람다 함수를 이용한 리스트의 제곱 구하기
a = list(map(lambda x : x**2, a))
print(a)

# 리스트 축약 표현식을 이용한 리스트의 제곱 구하기
a = [x**2 for x in a]
print(a)

# 리스트 축약 표현식과 range를 이용한 리스트의 제곱 구하기
a = [x**2 for x in range(1,8)]
print(a)
  • 위의 세 코드의 실행 결과는 모두 동일

문자열 각각을 대문자로 바꾸는 기능

st = 'Hello World'
s_list = [x.upper() for x in st]
print(s_list)

map() 함수와 리스트 축약 표현

  • 리스트 축약 표현의 장점
    • map() 함수는 map 객체를 생성하지만, 축약 표현을 사용하면 리스트 객체를 바로 생성할 수 있다
    • 간결한 표현으로 강력한 기능을 사용할 수 잇다
    • map() 함수를 사용하는 것보다 속도가 더 빠르다
    • 필터링까지 할 수 있어 filter() 함수의 역할도 수행한다

if 조건식을 이용한 필터링

  • list() 함수, filter() 함수, 람다 함수를 이용한 필터링
ages = [34, 39, 20, 18, 13, 54]
adult_ages = list(filter(lambda x: x>=19, ages))
print(adult_ages)
  • 리스트 축약 표현을 이용한 필터링
ages = [34, 39, 20, 18, 13, 54]
print([x for x in ages if x >= 19])
  • 실행 결과는 같다

리스트 축약 표현을 이용한 이중 for 루프 구현

  • 두 리스트를 곱하여 새 리스트를 생성하는 코드

리스트 축약을 이용한 두 리스트의 곱하기 기능

product_xy = []
for x in [1,2,3]:
    for y in [2,4,6]:
        product_xy.append(x * y)

print(product_xy)

product_xy = [x * y for x in [1,2,3] for y in [2,4,6]]
print(product_xy)

리스트의 축약 표현을 사용한 2와 3의 배수 구하기

[n for n in range(1,31) if n % 2 == 0 if n % 3 == 0]

리스트의 축약 표현을 사용한 2와 3과 5의 배수 구하기

[n for n in range(1,31) if n % 2 == 0 if n % 3 if n % 5 == 0]

리스트 축약 표현과 가독성

  • 리스트 축약 표현이 많은 장점을 가지고 있으나, 지나치게 많은 조건을 넣거나 표현식을 복잡하게 만들면 이해하기가 매우 어려워진다
  • 너무 많은 축약은 가독성을 해칠 수 있다는 점을 항상 이해하고 읽기 좋은 코드를 만들기 위해 노력을 기울여야 한다
[n for n in range(1,31) if n % 2 == 0 if n % 3 if n % 5 == 0]

# 줄바꿈을 통해 가독성 증가
[n for n in range(1, 31)
    if n % 2 == 0
    if n % 3 == 0
    if n % 5 == 0]