[python 문법] 리스트 내포 (for문, if문, elif문, 이중 for문 등)
파이썬에서 리스트 내포(List Comprehension)를 사용하면
짧고 간결한 코드로 복잡한 리스트 생성 작업을 수행할 수 있다.
리스트 내포를 활용하여 다양한 예시를 해결하는 방법을 알아보고
for문과 if문을 포함한 기본적인 사용법부터 복잡한 중첩된 구조까지 모두 다룬다,
또한, 동일한 작업을 일반적인 for문이나 if문으로 작성하는 방법도 함께 설명한다.
1. 기본적인 리스트 내포
1부터 10까지의 숫자를 담은 리스트를 만들어보자.
리스트 내포 사용
numbers = [i for i in range(1, 11)] # numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
일반적인 for문 사용
numbers = []
for i in range(1, 11) :
numbers.append(i)
# numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2. for문과 if문을 함께 사용
리스트 내포는 조건문을 결합해 특정 조건을 만족하는 항목만 리스트에 포함할 수 있다.
1부터 10까지의 숫자 중 짝수만 리스트에 담아보자.
리스트 내포 사용
even_numbers = [i for i in range(1, 11) if i % 2 == 0]
#even_numbers = [2, 4, 6, 8, 10]
일반적인 for과 if문 사용
even_numbers = []
for i in range(1, 11):
if i % 2 == 0:
even_numbers.append(i)
# even_numbers =[2, 4, 6, 8, 10]
리스트 내포에서 if문과 else문 사용의 한계
리스트 내포에서 if문만 단독으로 사용하는 것이 가능하지만,
if문이 리스트 내포의 앞쪽에 위치할 경우에는 반드시 else와 함께 사용해야 한다.
그렇지 않으면 SyntaxError: expected 'else' after 'if' expression 가 발생한다.
- 잘못된 사용 예시
# 잘못된 사용 예시
even_numbers_2 = [i if i % 2 == 0 for i in range(1, 11)]
print(even_numbers_2) # 구문 오류 발생(SyntaxError: expected 'else' after 'if' expression)
- 올바른 사용 예시
if문이 리스트 내포의 앞쪽에 위치했기 때문에 else와 함께 사용되어야 구문이 완전해진다.
even_or_none = [i if i % 2 == 0 else None for i in range(1, 11)]
print(even_or_none) # 출력: [None, 2, None, 4, None, 6, None, 8, None, 10]
3. if-else를 활용한 리스트 내포
1부터 10까지의 숫자 중 짝수는 2배, 홀수는 'odd'로 변환해 리스트에 담아보자.
리스트 내포 사용
even_or_odd = [i*2 if i % 2 == 0 else 'odd' for i in range(1, 11)]
# even_or_odd = ['odd', 4, 'odd', 8, 'odd', 12, 'odd', 16, 'odd', 20]
even_or_odd = []
for i in range(1, 11):
if i % 2 == 0:
even_or_odd.append(i*2)
else:
even_or_odd.append('odd')
#even_or_odd = ['odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even']
4. elif를 사용할 수 없는 리스트 내포
파이썬에서 리스트 내포를 사용할 때는 elif를 사용할 수 없기 때문에, 여러 조건을 순차적으로 평가하려면 중첩된 if-else 구조를 활용해야 한다.
리스트 내포 사용
numbers = [-5, 3, 0, 7, -2]
result = ["positive" if i > 0 else "negative" if i < 0 else "zero" for i in numbers]
# result = ['negative', 'positive', 'zero', 'positive', 'negative']
일반적인 for문과 if-else 사용
numbers = [-5, 3, 0, 7, -2]
result = []
for i in numbers:
if i > 0:
result.append("positive")
elif i < 0:
result.append("negative")
else: result.append("zero") print(result)
# result = ['negative', 'positive', 'zero', 'positive', 'negative']
근데 나는 뭔가 이중 중첩된 거 묘하게 불편해서 elif 써야하면 길게 쓸 듯 ㅋㅋ
5. 이중 for 문을 사용하는 리스트 내포
이중 for 문을 사용해 1부터 3까지의 숫자와 'a', 'b', 'c'를 조합한 모든 쌍을 생성해 보자.
리스트 내포 사용
combinations = [(i, j) for i in range(1, 4) for j in ['a', 'b', 'c']]
# combinations = [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
일반적인 중첩 for문 사용:
combinations = []
for i in range(1, 4):
for j in ['a', 'b', 'c']:
combinations.append((i, j))
#combinations = [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
5. 이중 for 문과 if 문을 결합
숫자가 짝수인 경우에만 조합을 리스트에 추가해보자.
리스트 내포 사용
filtered_combinations = [(i, j) for i in range(1, 4) for j in ['a', 'b', 'c'] if i % 2 == 0]
# filtered_combinations = [(2, 'a'), (2, 'b'), (2, 'c')]
일반적인 중첩 for문과 if문 사용
filtered_combinations = []
for i in range(1, 4):
for j in ['a', 'b', 'c']:
if i % 2 == 0:
filtered_combinations.append((i, j))
# filtered_combinations = [(2, 'a'), (2, 'b'), (2, 'c')]
6. 복잡한 조건을 포함한 리스트 내포
마지막으로, 숫자가 짝수이고 문자가 'a'인 경우에만 리스트에 추가해보자.
리스트 내포 사용
complex_filter = [(i, j) for i in range(1, 4) for j in ['a', 'b', 'c'] if i % 2 == 0 and j == 'a']
# complex_filter = [(2, 'a')]
일반적인 중첩 for문과 복합 조건 사용
complex_filter = []
for i in range(1, 4):
for j in ['a', 'b', 'c']:
if i % 2 == 0 and j == 'a':
complex_filter.append((i, j))
# complex_filter = [(2, 'a')]
리스트 내포는 파이썬에서 매우 유용한 도구이지만
과도하게 사용하면 오히려 가독성이 떨어질 수 있으니 주의해한다! 🧑💻