파이썬 리스트 컴프리헨션(list comprehension)은 기존 리스트를 기반으로 새로운 리스트를 만드는 방법입니다. 리스트 컴프리헨션은 주로 리스트에서 특정 항목을 필터링하거나 기존 리스트의 값을 변환할 때 사용되며, 대괄호([])로 묶어 표현합니다.
리스트를 다루다 보면 기존 시퀀스의 내용을 바탕으로 새로운 리스트를 만들어야 하는 경우가 자주 있습니다. 예를 들어 문자열의 각 문자로 리스트를 만들거나, 다른 리스트의 모든 요소에 2를 곱한 새 리스트가 필요할 수 있습니다.
바로 이럴 때 리스트 컴프리헨션이 유용합니다. 이 글에서는 파이썬 리스트의 기본 개념과 함께, 예제를 통해 리스트 컴프리헨션을 활용하는 방법을 자세히 살펴보겠습니다.
파이썬 리스트 기본 복습
리스트는 파이썬에서 여러 항목을 하나의 컬렉션으로 저장할 수 있는 자료구조입니다. 서로 연관된 여러 값을 함께 다뤄야 할 때 리스트가 널리 사용됩니다.
예를 들어 아이스크림 가게에서 판매하는 모든 맛의 목록을 저장하거나, 와인 동호회 회원들의 전화번호 목록을 관리할 때 리스트를 활용할 수 있습니다.
다음은 파이썬에서 리스트를 정의한 간단한 예시입니다:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']
리스트의 기본 개념을 복습했으니, 이제 리스트 컴프리헨션을 사용하는 방법을 알아보겠습니다.
파이썬 리스트 컴프리헨션이란?
파이썬 리스트 컴프리헨션은 기존 리스트(또는 다른 반복 가능 객체)의 내용을 기반으로 새로운 리스트를 생성합니다. 리스트를 그대로 복제하거나, 기존 리스트의 내용을 수정하여 새 리스트를 만들 수도 있고, 튜플이나 문자열 같은 다른 이터러블(iterable)의 내용을 리스트로 옮길 수도 있습니다.
필터 조건을 지정하면 새 리스트에 특정 값만 포함시킬 수도 있습니다. 예를 들어 숫자 리스트에서 250보다 큰 숫자만 모아 새 리스트를 만드는 식입니다.
기본 문법
파이썬 리스트 컴프리헨션의 기본 문법은 다음과 같습니다:
[expression for item in list]
이 문법은 파이썬 for문과 비슷하지만, 한 줄로 작성된다는 점이 다릅니다. 일반 for문과 구분하기 위해 리스트 컴프리헨션은 대괄호로 감싸서 표현합니다.
위 문법은 세 부분으로 구성됩니다:
- expression: 새 리스트에 들어갈 최종 값입니다.
- item: 반복 과정에서 순회하는 리스트의 개별 항목입니다.
- list: 리스트 컴프리헨션이 순회하는 대상 리스트 또는 이터러블 객체입니다(튜플, 문자열, 리스트 등이 해당됩니다).
if…else와 함께 사용하기
리스트 컴프리헨션 안에는 파이썬 if…else 문도 사용할 수 있습니다:
[expression for item in list if condition else none]
이런 형태의 컴프리헨션은 지정된 조건을 충족하는 항목만 리스트에 추가합니다.
리스트 컴프리헨션을 활용하면 전체 for문을 작성하지 않고도 기존 리스트에서 새 리스트를 만들 수 있습니다. 일반적인 for문은 최소 두 줄 이상의 코드가 필요하지만, 리스트 컴프리헨션은 한 줄로 작성할 수 있습니다.
리스트 컴프리헨션이 더 '파이썬다운(Pythonic)' 코드라고 말하는 사람들도 있는데, 짧은 for문을 사용하는 것보다 효율적이기 때문입니다.
파이썬 리스트 컴프리헨션 예제
가게에서 판매하는 치킨 피자만 모아 별도의 리스트를 만들어야 한다고 가정해 보겠습니다. 메뉴에서 치킨 피자들을 Chicken 카테고리로 분류하고 싶은 상황입니다. 이 작업은 for문으로 필터링할 수도 있지만, 리스트 컴프리헨션을 사용하면 훨씬 간결하게 처리할 수 있습니다.
기존 피자 리스트를 기반으로 이름에 Chicken이 포함된 피자만 담은 새 리스트를 만들어 보겠습니다:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] chicken_pizzas = [p for p in pizzas if "Chicken" in p] print(chicken_pizzas)
이 코드는 다음과 같은 결과를 출력합니다:
['Chicken', 'Chicken and Bacon', 'BBQ Chicken']
코드를 살펴보면, 먼저 메뉴의 피자 목록을 정의하고 pizzas 변수에 저장했습니다. 그다음 리스트 컴프리헨션을 사용해 이름에 Chicken이 포함된 피자만 담은 새 리스트를 생성했습니다.
이 리스트 컴프리헨션은 다음 세 부분으로 이루어져 있습니다:
- p: 리스트에 추가될 값입니다.
- for p in pizzas: 'pizzas' 리스트의 모든 피자를 하나씩 순회합니다.
- if "Chicken" in p: 각 피자 이름에 "Chicken"이 포함되어 있는지 검사합니다. 조건이 참(True)이면 'p'에 저장된 값이 새 리스트에 추가됩니다.
리스트 컴프리헨션은 단 한 줄의 코드로 처리되었습니다. 반면 다음 예제에서 볼 수 있듯이, for문으로 동일한 작업을 하려면 세 줄의 코드가 필요합니다. 리스트 컴프리헨션이 얼마나 깔끔한 코드를 작성하는 데 도움이 되는지 확인해 보겠습니다.
리스트 컴프리헨션 없이 작성하기
치킨 피자 예제로 돌아가 보겠습니다. 리스트 컴프리헨션 없이 메뉴의 치킨 피자 목록을 만들려면 다음과 같은 코드를 사용해야 합니다:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] chicken_pizzas = [] for pizza in pizzas: if "Chicken" in pizza: chicken_pizzas.append(pizza) print(chicken_pizzas)
이 코드 역시 동일한 결과를 출력합니다:
['Chicken', 'Chicken and Bacon', 'BBQ Chicken']
먼저 두 개의 리스트를 정의합니다. 하나는 가게에서 판매하는 피자 목록이고, 다른 하나는 치킨 피자를 담을 빈 리스트입니다.
그다음 'for'문으로 피자 리스트의 각 항목을 순회하면서, 각 피자 이름에 Chicken이라는 단어가 포함되어 있는지 확인합니다. 포함되어 있다면 해당 피자를 chicken_pizzas 리스트에 추가합니다. 이 예제에서는 세 개의 피자에 Chicken이 포함되어 있어, 세 개 모두 chicken_pizzas 리스트에 추가되었습니다.
보시다시피 피자 이름에 Chicken이 포함되었는지 확인하고 리스트에 추가하는 데 세 줄의 코드가 필요합니다. 리스트 컴프리헨션을 사용하면 이 코드를 훨씬 효율적으로 작성할 수 있습니다.
if…else를 활용한 리스트 컴프리헨션
리스트 컴프리헨션에는 if…else 문도 함께 사용할 수 있습니다.
앞서 우리는 if 문을 사용해 치킨 피자만 리스트에 추가했습니다. 즉, 피자 이름에 Chicken이 포함된 경우에만 추가했죠. 하지만 이번에는 어떤 피자가 채식인지 분류하는 리스트를 만든다고 가정해 봅시다.
피자 이름에 Chicken이 포함되어 있으면 'Meat'를, 포함되어 있지 않으면 'Vegetarian'을 리스트에 추가하려고 합니다.
이 작업은 리스트 컴프리헨션으로 다음과 같이 처리할 수 있습니다:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] is_veggie = ["Meat" if "Chicken" in p else "Vegetarian" for p in pizzas] print(is_veggie)
이 코드는 다음과 같은 결과를 출력합니다:
['Meat', 'Vegetarian', 'Meat', 'Vegetarian', 'Vegetarian', 'Meat']
코드를 단계별로 살펴보겠습니다. 먼저 pizzas라는 피자 리스트를 선언합니다. 그다음 리스트 컴프리헨션을 사용해 각 피자 이름에 Chicken이 포함되어 있는지 평가합니다.
피자 이름에 Chicken이 포함되어 있으면 Meat 값이 is_veggie 리스트에 추가되고, 그렇지 않으면 Vegetarian 값이 추가됩니다.
결과에서 첫 번째 값이 Meat인 이유는, pizzas 리스트의 첫 번째 항목이 Chicken이기 때문입니다. 반면 두 번째 값이 Vegetarian인 것은, 해당 항목인 Margherita에 Chicken이 포함되어 있지 않기 때문입니다.
마무리
리스트 컴프리헨션을 사용하면 기존 리스트를 기반으로 새로운 리스트를 손쉽게 만들 수 있습니다. 리스트를 복사하거나, 특정 조건에 따라 값을 필터링한 새 리스트를 생성하는 등 다양한 방식으로 활용할 수 있습니다.
이 글에서는 예제와 함께 파이썬 리스트의 기본 개념과 리스트 컴프리헨션 기법을 사용해 새 리스트를 만드는 방법을 살펴보았습니다.
파이썬 코딩을 더 배우고 싶으신가요? 파이썬 학습 가이드를 확인해 보세요. 파이썬 마스터를 향한 여정을 계속하는 데 도움이 되는 다양한 학습 자료를 소개하고 있습니다.