List Comprehension (리스트 내포)는 입력 Sequence로부터 지정된 표현식에 따라 새로운 리스트 컬렉션을 빌드하는 것으로 즉, 리스트를 쉽게 잛게 한 줄로 만들 수 있는 파이썬의 문법이다.
[출력표현식 for 요소 in 입력Sequence] [출력표현식 for 요소 in 입력Sequence [if 조건식]]
Sequence는 입력으로 사용되는 Iteration이 가능한 데이타 Sequence 혹은 컬렉션이다.
입력 Sequence는 for 루프를 돌며 각각의 요소를 하나씩 가져오게 되고, if 조건식이 있으면 해당 요소가 조건에 맞는지 체크하게 된다. 만약 조건에 맞으면 출력 표현식(Output Expression)에 각 요소를 대입하여 출력 결과를 얻게 된다.
- list comprehension 사용 전,
size = 10 arr = [0] * size for i in range(len(size)): arr[i] = i * 2 print(arr) // [0 ,2 ,4 ...18]
- list comprehension 사용 후,
size = 10 arr = [i * 2 for i in range(size)] print(arr) // [0 ,2 ,4 ...18]
앞에서는 리스트 컴프리헨션으로 생성되는 리스트의 크기는 순회하는 값에 맞게 결정된다는 것을 확인했다. 하지만 리스트 컴프리헨션은 if 조건문을 서서 특정값을 걸러내서 리스트의 원소로 넣거나 뺄 수 있다. 문법은 아래와 같이 리스트 컴프리헨션의 끝에 if 문을 넣기만 하면 된다.
[출력표현식 for 요소 in 입력Sequence [if 조건식]]
Sequence는 입력으로 사용되는 Iteration이 가능한 데이타 Sequence 혹은 컬렉션이다.
입력 Sequence는 for 루프를 돌며 각각의 요소를 하나씩 가져오게 되고, if 조건식이 있으면 해당 요소가 조건에 맞는지 체크하게 된다. 만약 조건에 맞으면 출력 표현식(Output Expression)에 각 요소를 대입하여 출력 결과를 얻게 된다.
- list comprehension 의 필터링 사용 (1개의 if문 사용)
size = 10 arr = [n for n in range(1, 11) if n % 2 == 0] # 2의 배수만 배열에 담는다. print(arr) [2, 4, 6, 8, 10]
- list comprehension 의 필터링 사용 (다중 if문 사용)
arr = [n for n in range(1, 31) if n % 2 == 0 if n % 3 == 0] # 2의 배수 and 3의 배수인 수만 배열에 담는다. print(arr) [6, 12, 18, 24, 30]
- list comprehension 의 필터링 사용 (if 와 OR 연산)
if 문을 여러 개 쓰지 말고, 한 if 문에서 ‘or’ 연산자로 논리 연산을 묶어줘야 한다.
만약 if or if로 사용하게되면 안된다.arr = [n for n in range(1, 16) if n % 2 == 0 or n % 3 == 0] # 한 if 문 내에서 or 연산 해결 print(arr) [2, 3, 4, 6, 8, 9, 10, 12, 14, 15]
아래의 코드는 리스트 컴프리헨션을 사용하지 않고 [[1,2,3], [4,5,6], [7,8,9]] 를 구현한 코드이다. 하지만 이를 리스트 컴프리헨션을 사용하여 아주 쉽게 구현할 수 있다.
- list comprehension 사용 전,
li = [] sub_li = [] for a in range(3): for b in range(3): sub_li.append(b) li.append(sub_li) sub_li = [] print(li) #[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
- list comprehension 사용 후,
arr = [[n for n in range(3)]for i in range(3)] print(arr)