list comprehension은 리스트를 쉽게 생성하기 위한 방법이다.
python에서 보편적으로 사용되는 기능으로 다양한 응용이 가능하다.
일반적인 리스트 작성방식을 코드로 살펴보자!
list = [] for i in range(10): list.append(i) print(list) #[0,1,2,3,4,5,6,7,8,9]
list comprehension을 사용한다면 append 메서드를 사용하지 않고 한줄의 코드로
같은 위와 동일한 리스트를 작성할 수 있다. list comprehension의 기본적인 형태는 다음과 같다.
[식 for 변수명 in iterable객체]
리스트나 튜플 등 iterable한 객체의 각 요소를 임의의 변수로 꺼내 식을 적용하여 그 결과가 요소가 되는 새로운 리스트가 리턴되는 방식이다.
처음 살펴봤던 리스트 작성코드를 list comprehension 을 활용해서 다시 작성해보자!
list = [i for i in range(10)] print(list) #[0,1,2,3,4,5,6,7,8,9]
같은 줄에 조건(if)을 설정하여 원하는 결과를 가진 list를 만들 수 있다.
list = [i for i in range(10) if i % 2 == 0] print(list) #[0,2,4,6,8]
if로만 조건을 처리하면 조건을 만족하는 요소만 리스트에 포함되어 반환되고
조건을 만족하지 못한 요소는 삭제된다. 그러나 if else와 같이 조건을 만족하지 않은 요소에 대해서도 별도의 처리가 필요한 경우 삼항 연산자를 이용하여 if else와 같은 처리를 할수 있다.
삼항 연산자를 활용한 list comprehension의 예시는 다음과 같다.
[조건과 일치했을 때의 값 if 조건식 else 불일치시의 값 for 변수명 in iterable객체]
list = ['odd' if i %2 == 1 else'even' for i in range(10)] #['even', 'odd, 'even', 'odd, 'even', 'odd, 'even', 'odd, 'even', 'odd,]
중첩된 for문을 한 줄로 정의하는 것도 가능하다. for 루프를 중첩하여 복수의 iterable 객체를 결합할 수 있다.
중첩 for문을 활용한 list comprehension의 예시는 다음과 같다.
[식 for 변수명1 in iterable객체1 for 변수명2 in iterable객체2]
list = [(i,j) for i in range(10) for j in range(i, 10)] print(list) #[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 6), (6, 7), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 8), (8, 9), (9, 9)]
## zip(), enumerate()와의 결합
for 문에서 자주 사용되는 편리한 함수로 복수의 reternal을 모아주는 zip()이나 인덱스와 값을 return하는 enumerate()가 있다.
zip()이나 enumerate()를 list comprehension에 사용하는 것도 물론 가능하다. 특수한 문법을 사용하는 것이 아니므로 for 문과의 대응을 생각하면 그렇게 어렵지 않다.
먼저 zip()의 활용방법을 살펴보자!
>```
list1 = ['a','b','c']
list2 = ['x','y','z']
list_zip = [(l1,l2) l1,l2 in zip(list1, list2)]
print(list_zip)
#[('a','x'), ('b','y'), ('c','z')]
다음으로 enumerate()의 활용방법을 살펴보자!
list = ['a','b','c'] list_enumerate = [(i, j) for i, j in enumerate(list)] print(list_enumerate) #[(0,'a'),(1,'b'),(2,'c')]
dict 객체도 comperhension으로 생성할 수 있다.
{} 안에 식의 부분에 키와 값 2개를 '키:값' 형태로 지정하여 작성하면 된다.
{키:값 for 변수명 in iterable객체}
키와 값에는 임의의 식을 지정할 수 있다.
list = ['aa', 'bbb', 'cccc'] dict = {i: len(i) for i in list} print(dict) #{'aa': 2 , 'bbb' : 3, 'cccc': 4}
키와 값 각각의 리스트로부터 새로운 사전을 만들고 싶은 경우는 zip()를 사용하면 된다.
keys = ['a', 'b', 'c'] values = [1,2,3] dict = {k: v for k,v in zip(keys,values)} print(dict) #{'a':1, 'b':2, 'c':3}