리스트 컴프리헨션이란?
리스트 컴프리헨션(List Comprehension)은 파이썬에서 리스트를 생성하는 간결하고 파이썬스러운 방법입니다. 반복문과 조건문을 활용해 리스트를 만들 수 있습니다. 이번에는 리스트 컴프리헨션의 기본 문법과 활용법에 대해 자세히 알아보겠습니다.
리스트 컴프리헨션이 무엇인가요? 리스트 컴프리헨션은 한 줄 표현식으로 리스트를 만드는 파이썬 구문입니다. 일반 for 반복문을 사용해 리스트를 만들어도 되지만, 리스트 컴프리헨션을 쓰면 더 간결하고 가독성 좋은 코드를 작성할 수 있습니다.
만약 1부터 10까지의 제곱수를 리스트로 만든다고 하면 일반 for 반복문으로는 다음과 같이 코드를 작성합니다.
squares = []
for i in range(1, 11):
squares.append(i ** 2)
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
반면 리스트 컴프리헨션을 사용하면 더 간단하게 표현할 수 있습니다.
squares = [i ** 2 for i in range(1, 11)]
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
리스트 컴프리헨션이 중요한 이유는 무엇일까요? 리스트 컴프리헨션은 간결하고 파이썬스러운 리스트 생성 방식을 제공합니다. 그렇기에 코드의 가독성과 유지보수성을 높일 수 있습니다. 또한 반복문과 조건문을 적절히 활용하면 복잡한 리스트를 쉽게 만들 수 있습니다.
리스트 컴프리헨션 기본 문법
리스트 컴프리헨션의 기본 문법은 다음과 같습니다.
[표현식 for 항목 in 순회가능객체]
위 문법에서 표현식은 리스트의 각 항목을 어떤 값으로 초기화할지를 결정합니다. for 항목 in 순회가능객체는 일반적인 for 반복문과 동일하게 작동합니다.
예를 들어, 0부터 9까지 숫자를 갖는 리스트를 만들고 싶다면 다음과 같이 작성하면 됩니다.
numbers = [i for i in range(10)]
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
이 문법에서 중요한 점은 리스트 컴프리헨션이 리스트를 만드는 과정을 아주 간단한 식으로 표현할 수 있다는 점입니다. 파이썬에서는 이런 간결한 표현 방식이 권장되기 때문에 리스트 컴프리헨션을 활용하는 것이 좋습니다.
조건문 포함하기
리스트 컴프리헨션에 조건문을 포함시킬 수도 있습니다. 이를 통해 원하는 조건에 맞는 항목만으로 리스트를 생성할 수 있습니다.
[표현식 for 항목 in 순회가능객체 if 조건]
예를 들어, 1부터 10까지 숫자 중 홀수만으로 이루어진 리스트를 생성하려면 아래와 같이 작성하면 됩니다.
odds = [i for i in range(1, 11) if i % 2 == 1]
print(odds) # [1, 3, 5, 7, 9]
조건문을 추가하면 더욱 다양하고 복잡한 리스트 생성이 가능해집니다. 리스트에 홀수 개수만큼의 문자열로 이루어진 'odd' 리스트를 만들려면 어떻게 해야 할까요?
words = ['hello', 'python', 'world', 'code', 'book']
odd_words = [word for word in words if len(word) % 2 == 1]
print(odd_words) # ['hello', 'world', 'code', 'book']
이처럼 리스트 컴프리헨션에 조건문을 추가하면 매우 다양한 방식의 리스트 생성이 가능해집니다. 반드시 익숙해지도록 합시다.
중첩 리스트 컴프리헨션
리스트 컴프리헨션은 중첩해서 사용할 수도 있습니다. 이를 통해 2차원 이상의 리스트를 효율적으로 만들 수 있습니다.
[(x, y) for x in range(3) for y in range(4)]
위 코드는 3x4 크기의 2차원 리스트 형태로 좌표 값을 생성합니다. 실행 결과는 다음과 같습니다.
[(0, 0), (0, 1), (0, 2), (0, 3),
(1, 0), (1, 1), (1, 2), (1, 3),
(2, 0), (2, 1), (2, 2), (2, 3)]
중첩 for 반복문도 허용됩니다.
[ [x * y for x in range(1, 4)] for y in range(1, 4)]
이 경우 3x3 크기의 2차원 리스트가 생성되며, 각 요소는 x * y 값으로 초기화됩니다.
[[1, 2, 3],
[2, 4, 6],
[3, 6, 9]]
중첩 리스트 컴프리헨션은 매우 간결하면서도 강력한 기능입니다. 리스트 컴프리헨션의 컴팩트한 구문대로 동작하므로 일반 중첩 for 반복문보다 가독성이 좋고, 리스트 생성 코드가 깔끔해집니다. 다만 중첩 수준이 너무 높아지면 오히려 가독성이 떨어질 수 있으므로 적절히 사용해야 합니다.
연산자를 활용한 리스트 컴프리헨션
단순히 리스트 항목을 나열하는 것 외에도, 리스트 컴프리헨션을 다양한 연산자와 함께 사용할 수 있습니다. 이를 통해 더욱 멋진 리스트를 만들 수 있습니다.
조건 부여 연산자(Conditional Expression)
리스트 컴프리헨션 내에서 if-else 조건문을 사용할 수 있습니다. 아래와 같이 if-else를 포함한 표현식을 사용하면 조건에 따라 서로 다른 값으로 리스트 항목을 초기화할 수 있습니다.
[n if n % 2 == 0 else '짝수 아님' for n in range(10)]
실행 결과는 다음과 같습니다.
[0, '짝수 아님', 2, '짝수 아님', 4, '짝수 아님', 6, '짝수 아님', 8, '짝수 아님']
복합 연산자
+, -, * 등의 산술 연산 외에도 리스트 컴프리헨션에서는 복합 연산이 가능합니다.
fruits = ["apple", "banana", "cherry", "durian", "elderberry"]
new_fruits = [f.upper() if len(f) >= 6 else f.lower() for f in fruits]
print(new_fruits)
# ['apple', 'banana', 'cherry', 'DURIAN', 'ELDERBERRY']
문자열 길이 조건에 따라 대소문자로 변환하여 새로운 리스트를 생성했습니다. 이처럼 리스트 컴프리헨션을 활용하면 간결하면서도 복잡한 리스트 생성이 가능합니다.
중첩 반복문
리스트 컴프리헨션에서는 중첩된 반복문 표현도 가능합니다.
[(x, y) for x in range(3) for y in range(3)]
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
함수 호출
리스트 컴프리헨션 안에서 함수를 직접 호출할 수도 있습니다.
import math
areas = [math.pi * (r ** 2) for r in range(1, 6)]
print(areas) # [3.141592653589793, 12.566370614359172, 28.274333882308138, 50.26548245743669, 78.53981633974483]
실전 예제: 리스트 컴프리헨션 활용하기
이제 실제 프로그래밍 상황에서 리스트 컴프리헨션의 활용 예시를 살펴보겠습니다.
예제 1) 문자열 리스트 처리하기
프로그램에서 사용자의 입력을 받아 특정 작업을 수행하는 경우가 많습니다. 이때 리스트 컴프리헨션을 활용하면 입력 데이터를 체계적으로 잘 처리할 수 있습니다.
inputs = input("단어들을 쉼표로 구분하여 입력하세요: ").split(",")
capitalized = [word.capitalize() for word in inputs]
print("첫 글자만 대문자로 변환된 단어들:")
print(capitalized)
위 코드는 사용자에게 단어들을 쉼표로 구분하여 입력받습니다. 그리고 리스트 컴프리헨션을 사용해 각 단어의 첫 글자만 대문자로 변환합니다.
실행 결과 예시:
단어들을 쉼표로 구분하여 입력하세요: apple,banana,cherry,durian
첫 글자만 대문자로 변환된 단어들:
['Apple', 'Banana', 'Cherry', 'Durian']
예제 2) 데이터 전처리하기
데이터 분석이나 머신러닝 분야에서는 데이터 전처리가 매우 중요합니다. 리스트 컴프리헨션은 데이터 전처리 작업을 간편하게 해줍니다.
# 성적 데이터 (이름, 국어, 영어, 수학)
scores = [
("John", 92, 83, 76),
("Emily", 88, 92, 67),
("Michael", 63, 74, 82),
("Jessica", 77, 68, 95),
("Tom", 54, 92, 61)
]
# 평균 성적 계산
avg_scores = [[name] + [sum(scores) / 3 for scores in student[1:]] for name, *student in scores]
print("이름 평균점수")
print("-" * 15)
for name, avg in avg_scores:
print(f"{name} {avg:.2f}")
위 코드는 학생 성적 데이터로부터 각 학생의 평균 점수를 계산합니다. 리스트 컴프리헨션을 중첩하여 사용했습니다.
실행 결과:
이름 평균점수
---------------
John 83.67
Emily 82.33
Michael 73.00
Jessica 80.00
Tom 69.00
예제 3) 데이터 시각화를 위한 데이터 가공
데이터 시각화에서는 분석 데이터를 시각화 라이브러리에 맞는 형식으로 가공해야 합니다. 리스트 컴프리헨션을 잘 활용하면 효율적인 데이터 가공이 가능합니다.
# 지역별 인구 데이터 (지역이름, 인구수)
population_data = [
("서울", 9720846),
("부산", 3456789),
("인천", 2876234),
("대구", 2427954),
("대전", 1504337),
("광주", 1460718)
]
# Plotly 라이브러리를 위한 데이터 가공
locations = [loc for loc, _ in population_data] # 지역명만 추출
populations = [pop for _, pop in population_data] # 인구수만 추출
import plotly.graph_objs as go
# 데이터 시각화
trace = go.Bar(x=locations, y=populations)
layout = go.Layout(title="지역별 인구 현황")
fig = go.Figure(data=[trace], layout=layout)
fig.show()
위 코드에서는 리스트 컴프리헨션을 사용하여 인구 데이터에서 지역명과 인구수만 각각 추출하여 locations와 populations 리스트를 생성합니다.
그리고 Plotly 라이브러리를 사용하여 이 데이터를 바탕으로 간단한 바 차트를 시각화합니다. 실행하면 다음과 같은 차트가 렌더링됩니다.
이렇게 리스트 컴프리헨션을 활용하면 데이터 가공 과정을 매우 간결하게 작성할 수 있어 코드 가독성이 높아지고 생산성도 향상됩니다.
리스트 컴프리헨션 주의사항
리스트 컴프리헨션은 코드를 간결하게 해주지만, 지나치게 복잡하게 사용하면 오히려 가독성이 떨어질 수 있습니다. 따라서 다음 사항에 유의하여 적절히 활용해야 합니다.
- 너무 많은 조건문이나 중첩 반복문을 사용하지 않도록 합니다. 리스트 컴프리헨션이 지나치게 복잡해지면 for 반복문으로 작성하는 것이 더 나을 수 있습니다.
- 내부 반복문의 변수명과 컴프리헨션 변수명이 겹치지 않도록 주의해야 합니다. 변수명이 중복되면 예상치 못한 결과가 발생할 수 있습니다.
- 너무 길거나 복잡한 표현식은 사용하지 않는 것이 좋습니다. 긴 표현식은 코드 가독성을 해칠 수 있습니다. 대신 함수나 메소드를 정의하여 호출하는 것이 낫습니다.
- 리스트 컴프리헨션이 너무 중첩되면 일반 for 반복문으로 풀어쓰는 것이 더 낫습니다. 중첩된 컴프리헨션은 코드 이해를 어렵게 합니다.
- 가독성을 위해 리스트 컴프리헨션을 여러 줄로 나누어 작성하는 것도 좋습니다. 줄바꿈과 들여쓰기를 잘 활용하면 가독성이 향상됩니다.
결국 리스트 컴프리헨션은 절대적인 원칙이 아닌 상황에 따라 적절히 활용해야 하는 방법론입니다. 간결함과 가독성의 균형을 잡아가며 점진적으로 활용 능력을 기르는 것이 중요합니다.
참고 자료
- Luciano Ramalho (2017), Fluent Python, 박완규 옮김, 인사이트. [4장 컴프리헨션 구문으로 컬렉션 가공하기]
- 박응용 (2017), 점프 투 파이썬, 초판 2쇄, 이지스퍼블리싱. [5장 파이썬 데이터 구조]
- 코드잇, 파이썬 리스트 컴프리헨션 완벽 가이드 https://www.codeit.kr/articles/python-list-comprehension-101?q=python%20list%20comprehension
- Real Python, Python List Comprehension https://realpython.com/list-comprehension-python/
한 고대 문서 이야기
여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오
gospel79.tistory.com
유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법
올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을
stock79.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'IT > 파이썬 기초 완전 정복' 카테고리의 다른 글
파이썬 데코레이터 패턴 익히기 (19) (1) | 2024.04.20 |
---|---|
파이썬 제너레이터 이해하기 (18) (1) | 2024.04.20 |
파이썬 람다 함수 기초 (16) (0) | 2024.04.20 |
파이썬 정규 표현식 다루기 (15) (0) | 2024.04.20 |
파이썬 문자열 처리 기초 (14) (1) | 2024.04.20 |
댓글