[Python] list comprehension이란?

resilient

·

2021. 7. 1. 15:54

728x90
반응형

사진출처:https://mangastorytelling.tistory.com/

파이썬으로 알고리즘문제를 풀 때, 입력으로 받은 2차원 배열을 주어진 개수만큼의 리스트로 묶어서 리스트를 갱신한다던가, 주어진 리스트를 활용해서 다른 리스트를 효율적으로 만들 때 주로 사용했던 방법 중에 list comprehension이란 방법이 있었다. 무작정 사용하기만 했었는데, 이번 게시물에서 한 번 정리를 해보면서, list comprehension이 뭔지, 왜 쓰는지 자세히 한번 알아보려고 한다. 이번 게시물은 내가 즐겨찾는 블로그를 참고했다.

list comprehension

리스트 컴프리헨션은 쉽게 말해 ‘리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법’이다. 

 

예를 들어보자, 아래 코드를 실행하면 dp에는 0,2,4,6,8 ... 18 까지의 값이 들어갈 것이다.

n = 10
dp = [0] * n
for i in range(n):
    dp[i] = i * 2

위와 같은 과정은 배열을 만들어주고 반복문을 통해 배열에 값을 하나하나 넣는 방식이다.

list comprehension은 이 과정을 간단하게 만들어 준다.

 

‘리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법’ ,이때 특히 짧게 한 줄로가 중요한 것 같다. 보통 배열을 만들고 사용할 때는 선언과 할당을 같이 하고, 선언만 하거나 할당만 하는 경우는 없기 때문에 이 작업을 간편하게 한 줄로 해결하는 것이 리스트 컴프리헨션이다.

 

리스트 컴프리헨션의 기본적인 문법은 다음과 같다.

[ ( 변수를 활용한 값 ) for ( 사용할 변수 이름 ) in ( 순회할 수 있는 값 )]

이 문법은 앞선 예제의 파이썬 버전과 비교해보면 좀 더 쉽게 이해할 수 있다. 배열을 만들고 for 반복문 안에서 각 원소의 값을 할당하는 작업이 이 한 줄로 일어난다. 괄호 안의 이름들을 조금 설명해보겠다.

 

  • 변수를 활용한 값
    • 이는 앞선 코드의 ‘i * 2’에 대응된다.
  • 사용할 변수 이름
    • 앞선 코드의 ‘i’에 대응된다. 파이썬의 for 문에서 ‘for’와 ‘in’ 사이에 for 블락 안에서 사용될 인자의 이름을 쓰는 것과 같다. ‘i’ 대신에 ‘n’ 등 어떤 단어를 써도 된다.
  • 순회할 수 있는 값
    • 여기서 ‘순회할 수 있는 값’은 range 처럼 값을 하나씩 살펴볼 수 있는 것을 총칭한다. range 뿐 아니라 다른 리스트, set, dict, tuple 등도 될 수 있다. 일반 for문에서 쓸 수 있는 모든 값이 들어갈 수 있는 것이다. 

이제 위에서 봤던 예제를 list comprehension을 통해 다시 작성해보면 아래와 같은 코드가 나온다.

n = 10
dp = [i * 2 for i in range(n)]

print(dp)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

 

정수값 뿐만 아니라 문자열에서도 사용 가능하다.

아래 예시를 보면 한번에 이해할 수 있을 것이다.

word = "안녕하세요"
ans = [a * 2 for a in word]
print(ans)

['안안','녕녕','하하','세세','요요']

 

위에서 언급한 list comprehension 기본적인 구조에 if 문을 추가 할 수도 있다.

아래 예시를 보면 list comprehension에서 조건문을 통해서 특정 값을 필터링해서 리스트화 시킬 수 있다.

n = 10
dp = [i for i in range(1, n+1) if i % 2 == 0]

print(dp)

[2, 4, 6, 8, 10]

 

그럼, 2의 배수인 동시에 3의 배수인 즉, 최소공배수인 6의 배수의 값을 필터링 하는 예제를 보자.

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

print(dp)

[6, 12, 18, 24, 30]

위와 같이 작성해주면 정상적으로 프로그램 실행이 되지만 아래와 같이 작성하면 Syntax Error가 뜨는데 이유를 한번 찾아봐야겠다. 내가 참고한 블로그를 보고 이 부분에 대한 궁금증을 갖게 되었다.

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

Syntax Error!

 

그럼 내가 실전에서 알고리즘 문제를 풀때 사용했던 list comprehension을 보면서 다시 이해해보자.

 

백준-16113(시그널)

n = int(input())
data = list(input().rstrip())
length = len(data)
number = length//5
# list comprehension
number = [data[i * (number) : (i+1) *(number)] for i in range((length + (number) - 1)//(number))]

////////////////////
40
data =[###..#..#.#..#..###..#..#.#..#..###..#..]
number = [['#', '#', '#', '.', '.', '#', '.', '.'], 
          ['#', '.', '#', '.', '.', '#', '.', '.'], 
          ['#', '#', '#', '.', '.', '#', '.', '.'], 
          ['#', '.', '#', '.', '.', '#', '.', '.'], 
          ['#', '#', '#', '.', '.', '#', '.', '.']]

간단하게 코드를 설명하자면, 5의배수로 주어지는 data를 입력받고, data 리스트 길이를 이용해서 최대 행이 5인 2차원 배열 number로 바꾸는 코드였다.

 

 

반응형

'Language > Python' 카테고리의 다른 글

[Python] 파이썬 lambda 란?  (1) 2021.09.01
[Python] join함수 란?  (0) 2021.07.04
[Python] 파이썬 eval함수 란?  (0) 2021.07.03
[Python]파이썬 정리노트(계속 업데이트)  (0) 2021.05.28