안녕하세요
이번엔 파이썬에서 간결하고 실용적이고, 직관적인 기능
"리스트 컴프리헨션"
을 알아보겠습니다.
-목차-
1. 리스트 컴프리헨션(List Comprension)이란?
2. 기초 사용법
3. 응용
1) 수식이나 함수 적용
2) 조건문 사용
3) for문 2개 사용
1. 리스트 컴프리헨션(List Comprension)이란?
리스트 컴프리헨션은 직관적으로 리스트를 생성하는 방법입니다. 대괄호 "[", "]"로 감싸고 내부에 for문과 if 문을 사용하여 반복하며 조건에 만족하는 것만 리스트로 생성할 수 있습니다.
그냥 리스트를 생성하고 for문과 if문을 사용하면 되지 굳이 리스트 컴프리헨션을 사용할 필요가 있을지 궁금할 수 있습니다. 리스트 컴프리헨션을 사용하는 큰 이유는 직관적이고, 여러줄 쓸걸 한줄에 만들어 주기 때문입니다. 심지어 속도도 더 빠릅니다.
2. 기초 사용법
먼저, 리스트 컴프리헨션을 쓰지 않고, 0부터 4사이의 정수로 리스트를 생성해 보겠습니다.
li=[]
for i in range(5):
li.append(i)
* 출력
이를 리스트 컴프리헨션을 이용하면 아래의 코드처럼 한줄에 처리가 가능합니다.
[i for i in range(5)]
* 출력
* 코드 설명
리스트 컴프리헨션을 이용해 0~4 리스트로 만들기.
list(range(5))
* 출력
* 코드 설명
리스트 컴프리헨션을 쓰지 않고, 위와 같은 코드로도 0과 4 사이의 정수를 리스트로 만들 수 있습니다.
이 방법이 더 효율적인 것 같습니다. 하지만, 리스트 컴프리헨션을 사용하는 이유는 대괄호 내에서 수식이나 함수 적용뿐만 아니라, if - else문으로 조건을 자유롭게 줄 수 있다는 점입니다.
3. 응용
1) 수식이나 함수 적용
① 수식 적용
[i*10 for i in range(5)]
* 출력
* 코드 설명
변수 i가 0~4까지 반복하며 10을 곱해, 0부터 40을 출력할 수도 있습니다.
② 함수 적용
def test(x):
x = str(x)+'ab'
return x
[test(i) for i in range(5)]
* 출력
* 코드 설명
test 함수 : x를 입력받아 문자열로 바꾼 뒤 ab를 추가하여 반환해주는 함수
[test(i) for i in range(5)] : 0과 4 사이의 수를 test함수에 넣고 반환한 값을 리스트로 생성
위처럼, 리스트 컴프리헨션에서는 리스트로 만들고자 하는 값에 함수도 적용할 수 있습니다.
(수식이나 함수뿐만 아니라 변환되는 모든 것을 다 적용할 수 있습니다.)
2) 조건문 사용
사실 list 컴프리헨션을 쓰다 보면 이 조건문을 쓰는 게 매우 편리합니다. 조건문은 리스트 컴프리헨션에서 왼쪽에 쓸 수도 있고, 오른쪽에 쓸 수도 있습니다. if문만 쓸 때는 오른쪽에, if else문을 쓸때는 왼쪽에 씁니다.
① 오른쪽에 if문 사용
[i for i in range(5) if i%2==0]
* 출력
* 코드 설명
i for i in range(5)에서 i가 0~4를 반복합니다. 이때, if i%2==0은 i가 2로 나누어 나머지가 0일 때 즉, i가 2로 나누어 떨어질 때라는 조건을 사용하여 0~4중에서 2로 나누어 떨어지는 [0, 2, 4]만 출력하도록 합니다.
오른쪽에 if문을 여러 개 사용할 수 돼있습니다.
[i for i in range(5) if i%2==0 if i%4==0]
* 출력
*코드 설명
오른쪽에 if i%2==0과 if i%4==0은 and 조건으로 묶여 동시에 만족하는 경우만 출력하도록 합니다. 즉, 2로도 나누어 떨어지고, 4로도 나누어 떨어지는 경우가 출력됩니다. 0~4중에서 [0, 4]만 여기에 해당됩니다.
② 왼쪽에 if문 사용(else 같이 사용)
왼쪽에 if문을 사용할 때는 반드시 else와 같이 사용해야 합니다.
[i if i%2==0 else 'odd' for i in range(5)]
* 출력
*코드 설명
왼쪽에 i if i%2==0 else 'odd'는 i가 2로 나누어 떨어질 때는 i를 출력하고, 그렇지 않을 때는 'odd'를 출력하라는 의미입니다. 즉, 2로 나누어 떨어지는 0, 2, 4에 대해선 그대로 출력하고, 2로 나누어 떨어지지 않는 1과 3에 대해 선 'odd'를 출력하게 합니다.
왼쪽에 if else 문은 여러 개를 사용할 수 있습니다. 그렇게 되면 elif와 같은 효과를 주게 됩니다.
[i if i%2==0 else 'odd-1' if i==1 else 'odd-3' for i in range(5)]
* 출력
* 코드 설명
i if i%2==0 else 'odd-1' if i==1 else 'odd-3'을 분해해보겠습니다.
i if i%2==0 : i가 2로 나누어 떨어지면 i를 그대로 출력
else 'odd-1' if i==1 : 2로 나누어 떨어지지 않으면, i가 1일 때 'odd-1' 출력
else 'odd-3' : 위의 두 조건이 모두 성립하지 않으면 'odd-3' 출력
정리하자면, i가 2로 나누어 떨어지면 그대로 출력하고, 1일 때는 'odd-1'을 출력하고 그렇지 않은 경우는 3밖에 남지 않으므로, 3일 때 'odd-3'이 출력됩니다.
3) for문 2개 사용
리스트 컴프리헨션을 이용하면 for문을 2개 사용함으로써 중첩 for문의 효과를 줄 수 있습니다.
[(i,j) for i in range(2) for j in range(3)]
* 출력
* 코드 설명
i가 0,1을 반복하며, 각각 j가 0~2를 반복하게 됩니다. 즉, i가 2번 반복되는 동안, j가 3번 반복되어 총 6가지가 출력됩니다. 출력되는 i, j에 대해서 괄호로 묶어야 정상 동작합니다.
위의 리스트 컴프리헨션을 풀어서 작성해보면 아래와 같은 코드가 됩니다.
li=[]
for i in range(2):
for j in range(3):
li.append((i,j))
* 출력
위의 리스트 컴프리헨션과 동일한 출력이 나옵니다.
리스트 컴프리헨션은 대괄호로 둘러쌓고 안에 코드를 입력하게 됩니다.
그런데 대괄호 대신에 중괄호 "{" "}"로 둘러쌓게 되면 집합 컴프리헨션(Set Comprehension)가 됩니다.
이때, 딕셔너리의 형식에 맞게 키(key)와 값(value)을 콜론(":")을 사용하면 딕셔너리 컴프리헨션(Dictionary Comprehension)이 됩니다.
또한, 소괄호 "(" ")"를 사용하면 Generator expression이 됩니다. Generator의 개념을 알면 유용하게 사용할 수 있습니다.
이상으로 리스트 컴프리헨션에 대한 포스팅을 마치겠습니다.
다음에 더 재미있고 유익한 글로 찾아오겠습니다.
읽어주셔서 감사합니다.
* 위의 실습 코드는 아래의 깃허브에 모두 정리해두었습니다.
https://github.com/netsus/python_practice/blob/master/list%20comprehension.ipynb
'Programming > Python 꿀팁' 카테고리의 다른 글
[Python] Redmine API 사용법 (0) | 2020.09.04 |
---|---|
[Python] dictionary max value에 대한 key 찾기 (0) | 2020.09.02 |
[Python] VCF 파일을 데이터프레임(DataFrame)으로 (0) | 2020.09.01 |
[Python] 이미지에 글자넣고 사이즈 조절하기(PIL library) (0) | 2020.08.28 |
linux 서버에서 메일보내기 (python 이용) (2) | 2020.06.30 |