본문 바로가기
Python/기초

[파이썬/Python] List Comprehension: 효율적인 리스트 생성

by 모두의 케빈 2023. 7. 7.

List Comprehension


 

List Comprehension, 리스트 표현식 또는 리스트 조건식이라고 번역합니다. Comprehension은 이해력이라는 뜻입니다. 따라서 List Comprehension은 리스트를 얼마나 이해하고 잘 생성할 수 있는지를 의미하는 것 같습니다.

 

List Comprehension은 아래와 같이 사용합니다.

[변수 for 변수 in Iterable 객체]

 

0부터 9까지의 원소를 가진 1차원 리스트를 만들어보겠습니다.

list_a = [i for i in range(10)]
print(list_a)

# 위 코드의 결과값
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

List Comprehension의 장점 중 하나로, 변수의 값을 활용할 수 있다는 점입니다. 0부터 9까지의 수를 제곱한 숫자를 원소로 갖는 1차원 리스트를 만들어보겠습니다.

list_a = [i*i for i in range(10)]
print(list_a)

# 위 코드의 결과값
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

참고로, 리스트만 이렇게 만들 수 있는 것은 아닙니다. Set이나 Tuple, dict와 같은 컬렉션 자료형도 유사한 방법으로 만들 수 있습니다. 우선은 Set만 만들어보겠습니다.

set_a = {i*i for i in range(10)}
print(list_a, type(set_a))

# 위 코드의 결과값
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'set'>

 

 

 

List Comprehension 응용: 여러 개의 for문 사용


 

for문을 2번 사용하거나, 2차원 배열을 만들거나, if문을 List Comprehension과 함께 사용할 수 있습니다.

 

 

List Comprehension에서 여러 개의 for문을 사용한다면 for문이 실행되는 순서는 오른쪽에서부터 왼쪽으로 차례대로 진행됩니다.

# List Comprehension에서 for문은 무조건 오른쪽에서 왼쪽으로 진행된다.
[변수1과 변수2를 활용 for 변수2 in Iterable for 변수1 in Iterable]

 

2개의 for문의 변수를 곱해서 1차원 배열의 리스트를 만들어보겠습니다.

# 오른쪽에서부터 왼쪽이므로, 먼저 i의 for문이 실행됩니다.
[i*j for j in [1,2,3] for i in [10,20,30]]

# 위 코드의 결과값
[10, 20, 30, 20, 40, 60, 30, 60, 90]

 

 

다음으로는 2차원 배열을 만들어보겠습니다. 2차원 배열은 배열 안의 원소로 배열을 갖는 형태입니다. 따라서 1차원 배열에서 '변수' 자리에 대괄호([])를 씌워주면 됩니다.

# 하나의 for문에 '변수' 자리에 대괄호를 씌워준다.
[[변수1과 변수2를 활용 for 변수2 in Iterable] for 변수1 in Iterable]

 

이번에도 2개의 for문을 사용하여, 각각의 원소가 곱해진 2차원 배열을 만들어보겠습니다.

[[i*j for j in [1,2,3]] for i in [10,20,30]]

# 위 코드의 결과값
[[10, 20, 30], [20, 40, 60], [30, 60, 90]]

 

 

List Comprehension 응용: if 문 사용


 

다음으로는 if문을 함께 사용해 보겠습니다. if문을 사용하는 규칙은 아래와 같습니다.

[변수 for 변수 in Iterable 조건]

 

위 조건을 참고하여 2의 배수만 리스트로 만들어보겠습니다.

[i for i in range(10) if i % 2 == 0]

# 위 코드의 결과값
[0, 2, 4, 6, 8]

 

if문과 else문도 함께 사용할 수 있습니다.

[참 if 조건 else 거짓 for 변수 in Iterable]

 

2의 배수이면 999, 2의 배수가 아니면 원래의 값을 원소로 하는 리스트를 만들어보겠습니다.

[999 if i%2 == 0 else i for i in range(1,11)]

# 위 코드의 결과값
[1, 999, 3, 999, 5, 999, 7, 999, 9, 999]

 

댓글