Channi Studies

[python] list comprehension 리스트 컴프리헨션 본문

python

[python] list comprehension 리스트 컴프리헨션

Chan Lee 2023. 10. 9. 23:41

모두가 알다시피 python의 장점 중 하나는 간단한 문법이다.

다른 언어에서 많은 줄을 사용해야 만들 수 있는 리스트를 한 줄로 표현할 수 있다.

list comprehension을 잘 이용하면 코드가 훨씬 간결하고 이뻐보인다.

예시를 들어보겠다

 

정수 리스트가 주어졌을 때, 각 요소에 1을 더한 새로운 리스트를 만들고 싶을 때,

list comprehension을 이용하지 않으면 for문을 활용하여 다음과 같이 작성할 수 있다.

my_list = [1, 2, 3]
new_list = []
for num in my_list:
	new_list.append(num + 1)
    
print(new_list) 		# = [2, 3, 4]

 

하지만, list comprehension을 이용하면 다음과 같이 작성할 수 있다.

my_list = [1,2,3]
new_list = [num + 1 for num in my_list]

print(new_list)			# = [2, 3, 4]

확실히 3줄이였던 코드가 훨씬 깔끔하게 한 줄로 표현이 되었다.

 

list comprehension에는 추가적으로 조건을 부여할 수 있다.

예를 들어 아까의 예시에서, 홀수 숫자(1, 3)만 두배를 하는 조건을 걸어보자

my_list = [1, 2, 3, 4, 5 ,6]
new_list = [num * 2 if num % 2 == 1 else num for num in my_list]

print(new_list)			# = [2, 2, 6, 4, 10, 6]

 

만약 코드를 다음과 같이 짜면 오류가 발생하니, 순서를 숙지하도록 하자

my_list = [1, 2, 3, 4, 5 ,6]
new_list = [num * 2 for num in my_list if num % 2 == 1 else num ]	# Syntax Error

print(new_list)

 

또한, 코드를 다음과 같이 짜면 짝수인 경우를 무시하게 된다.

조건문이 모든 요소를 대상으로 하고 있는지를 확실히 하자.

my_list = [1, 2, 3, 4, 5 ,6]
new_list = [num * 2 for num in my_list if num % 2 == 1]

print(new_list)			# = [2, 6, 10]

 

list comprehension은 숫자 리스트에서만 적용되는 것이 아니다.

다음과 같은 예시를 보면, 문자 리스트에서 적용됨을 알 수 있다. (문자열.upper() 메소드는 모든 문자열을 대문자로 변경한다.)

name_list = ["Ricky", "Isabelle", "Hailey", "Johnson", "Heiden"]
new_name_list = [name.upper() for name in name_list]

print(new_name_list)			# = ["RICKY", "ISABELLE", "HAILEY", "JOHNSON", "HEIDEN"]

 

문자열 리스트에서도 역시, 조건문을 통해 일부 문자에만 적용하는 것이 가능하다.

아까의 예시에서 글자 수가 6개인 문자만 대문자로 바꾸어 리스트로 만들어보자.

name_list = ["Ricky", "Isabelle", "Hailey", "Johnson", "Heiden"]
new_name_list = [name.upper() if len(name) == 6 else name for name in name_list]

print(new_name_list)			# = ["Ricky", "Issabelle", "HAILEY", "Johnson", "HEIDEN"]

정상적으로 적용되어 글자 수가 6개인 Hailey, Heiden에만 upper()메소드가 적용된 것을 확인할 수 있다.