Python/파이썬 기초

파이썬 리스트 컴프리헨션(List Comprehension) 예제 총정리

jimmy_AI 2022. 2. 13. 13:18
반응형

Python 리스트 컴프리헨션(조건제시법) 경우의 수 정리

안녕하세요. 이번 시간에는 파이썬에서 조건제시법으로 리스트 자료형의

원소들을 간단하게 생성할 수 있는 기능인 리스트 컴프리헨션(List Comprehension)의

활용 방법에 대해서 총망라해보는 시간을 가져보도록 하겠습니다.

 

 

List Comprehension 기본형

리스트 컴프리헨션의 기본 사용 방법은 아래의 형태와 같습니다.

[생성될 원소 for 반복될 값 조건]

 

주로, 조건을 반복 제시하는 경우는 for문을 이용하여 구현되는데요.

예를 들어, 3, 6, 9, 12, ... ,30 까지의 원소를 생성하고 싶은 경우는

1~10까지의 수에 대하여 3을 곱해주는 형태의 조건을 제시하면 될 것입니다.

 

이 경우 아래와 같은 코드 한줄로 손쉽게 해당 원소들을 가지는 리스트를 만들 수 있습니다.

[3 * x for x in range(1, 11)]

# 결과 : [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

여기서 range(1, 11)은 1~10의 수열을 의미하고, 따라서, x에 1, 2, 3, ..., 10의 값이 순회할 때,

3 * x는 3, 6, 9, ..., 30의 값이 담기므로 위의 결과가 생성됨을 이해할 수 있습니다.

 

 

이번에는 1~15까지 수에 대한 제곱수들을 출력하는 예제를 다루어보겠습니다.

이 경우 1~15까지의 수열이 제시될 조건이고,

제시된 수에 대하여 제곱을 하는 형태가 생성될 원소로 볼 수 있습니다.

[x ** 2 for x in range(1, 16)]

# 결과 : [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225]

 

 

조건문(if문)을 포함한 리스트 컴프리헨션

좀더 복잡한 경우의 예제로 이번에는 if를 이용한 조건문을 포함한 경우를 살펴보겠습니다.

if문이 포함된 케이스에서는 아래의 형태로 조건을 제시해주시면 됩니다.

[생성될 원소 for 반복될 값 조건 if 필터링할 조건]

 

예를 들어, 3의 배수를 위와 같이 생성하는 대신, 9의 배수는 제외하고 싶다고 가정해보겠습니다.

 

1~10에 대해서 반복될 값 조건을 사용한다고 가정하면, 

여기에 3을 곱한 값을 반환하되, 주어진 값이 3의 배수라면 3을 곱하면 9의 배수이기에 제외해야

위의 조건을 만족하는 리스트를 생성할 수 있을 것입니다.

 

여기서는 다음과 같이 코드를 작성해볼 수 있습니다.

[3 * x for x in range(1, 11) if x % 3 != 0]

# 결과 : [3, 6, 12, 15, 21, 24, 30]

가장 처음에 보았던 코드에서 뒤에 if문으로 x가 3의 배수인 경우를 제외하여

결과적으로 9의 배수를 제외한 상황을 이해해볼 수 있었습니다.

반응형

이중 for문을 이용한 경우

물론, 리스트 컴프리헨션에서 for문이 2개 이상이 들어간 경우도 구현이 가능합니다.

이럴 때는 외부 for문부터 내부 for문의 순서로 작성해주시면 되며,

iterate 문자가 겹치지 않도록 하는 것에 유의해주시면 됩니다.

 

사용 형태를 일반화 하면 아래처럼 나타낼 수 있습니다.

[생성될 원소 for 겉에서 반복될 값 조건 for 속에서 반복될 값 조건]

 

예를 들어, 구구단에서의 2, 3, 4단의 값들을 순서대로 출력하고 싶은 상황을 가정해보겠습니다.

 

2중 for문으로 구현하는 상황을 고려해본다면

외부에서는 2, 3, 4의 숫자가 순서대로 순회해야 할 것이며,

내부에서는 2~9의 수열이 순차적으로 제시되어 두 값을 곱하면 될 것으로 보입니다.

[x * y for x in range(2, 5) for y in range(1, 10)]

# 결과 : [2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36]

물론, 3개 이상의 for문 적용이나, 다중 for문 이후에 if문을 추가하는 것도 가능합니다.

 

 

정의한 함수를 리스트 내에 적용

마지막으로 조금 더 응용된 예시로 def 등으로 정의한 함수를 이용하여

더 복잡한 리스트 컴프리헨션을 구현한 예제를 살펴보겠습니다.

 

또한, 꼭 iterate하는 반복 조건이 숫자의 형태일 필요는 없으며,

여기서는 문자열을 활용한 예제를 보여드리겠습니다.

 

예를 들어, 각 글자가 모음이면 aa를 추가, 자음이면 bb를 추가하는 함수를 만들고,

특정 문자열의 글자를 순회하며 함수를 적용하는 간단한 예제를 살펴보며

이 글을 마무리해보도록 하겠습니다.

def add_ab(word):
    if word in ['a', 'e', 'i', 'o', 'u']: return word + 'aa'
    else: return word + 'bb'

[add_ab(x) for x in 'airplane']

# 결과 : ['aaa', 'iaa', 'rbb', 'pbb', 'lbb', 'aaa', 'nbb', 'eaa']

'airplane' 문자열을 예시로 든 경우, 모음인 문자의 뒤에는 aa가 추가되었고,

자음인 다른 문자 뒤에는 bb가 추가된 결과를 살펴볼 수 있었습니다.