본문 바로가기
[파이썬]/내포문

[파이썬][내포문] 리스트 내포문

by sung min_Kim 2023. 11. 7.
리스트 내포문

리스트 안에서의 반복문

리스트 내포문은 기존 리스트를 기반으로 새로운 리스트를 생성하는 방법이다.

 


· 기본 형태

 

[표현식 for 항목 in 반복가능객체 if 조건]

 

  • 표현식은 새로운 리스트의 각 요소를 결정하는 부분이다.
  • 표현식 이하의 for문 반복가능객체는 기존의 반복가능객를 순회하는 부분이다.
  • if문은 선택적으로 사용할 수 있는데, 참인 경우에만 해당 항목을 새로운 리스트에 포함시킨다.


 

· 동작 원리

 

 반복가능객체의 각 요소들을 순회하여 항목에 값을 할당하고 표현식을 통해 리턴된다.

 

[i for i in range(1,11)] # [ 1 ... 10 ] 출력

 for문은 range 함수를 사용하여 생성한 1부터 10까지의 리스트에 각 요소들을 순회하여 항목 i에 할당한다. 항목 i는 할당된 값을 표현식 i를 통해 리턴된다.


리스트 내포문에 대해 몇 가지 예를 들어 보자.

 

· 조건에 따른 리스트 생성

 

 아래의 구문은 for문의 li의 각 요소들을 순회하여 변수 i에 값을 할당하고, if문의 조건을 부합하는 방식으로 변환하여 표현식 i에 값을 전달하여 새로운 리스트를 생성한다.

li = [1, 2, 3, 4, 5]
ls = [i * 2 for i in li if i % 2 == 0]
print(ls) # [4, 8] 출력
          ## 특정 조건 : i 가 짝수

 

· 리스트 요소의 변환

 

  • 곱 연산

 아래 구문은 li의 각  요소들을 순회하여 항목 i에 할당한 값을 if문의 조건에 부합하는 방식으로 변환하여 표현식 i에 담아 곱 연산을 통해 새로운 리스트를 생성한다.

li = [1, 2, 3, 4, 5]
ls = [i * 2 for i in li if i % 2 == 0]
print(ls) # [4, 8] 출력

 

  • 제곱 연산

 아래 구문은 range 함수를 사용해 생성된 1부터 5까지의 각 요소들을 순회한 값을 항목 x에 할당하고, 할당한 값이 홀수인 경우에만 표현식 x에 담아 제곱 연산을 통해 새로운 리스트로 생성한다.

[x ** 2 for x in range(1,6) if x % 2 == 1] # [1, 9, 25] 출력
                                           ## 특정 조건 : x 가 홀수

 

· 중첩 리스트를 하나의 리스트로 생성

 

 아래의 구문은 리스트 안의 리스트를 하나의 리스트로 생성하는 예이다.

 li 객체 안의 각 리스트를 순회하여 해당 리스트를 항목 x에 할당한다.

 이하의 for 문에서는 x 객체(리스트) 안의 각 요소들을 순회하여 항목 y에 할당하고 표현식 y는 새로운 리스트를 생성한다. 

li = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[y for x in li for y in x] # [ 1 ... 9 ] 출력
                           ## li 안의 각 각의 리스트 [1, 2, 3] 를 순회하여 x 항목에 할당

 

· 중첩된 리스트를 하나의 리스트로 반환

 

 아래의 구문은 두 리스트를 zip 함수로 묶은 튜플 형태의 값을 각 항목 a와 b에 할당하여 표현식에서 이를 더하여 하나의 리스트로 반환한 구문이다.

 

 각 리스트의 첫 번째 원소를 묶은 튜플 (1, 4), 각 리스트의 두 번째 원소를 묶은 튜플 (2, 5), 각 리스트의 세 번째 원소를 묶은 튜플(3, 6)을 순서대로 반환한다.

 이후 각 각의 값을 항목 a와 b에 할당하여 표현식에서 더하기 연산자를 통해 새로운 리스트로 반환하였다.

list_a = [1, 2, 3]
list_b = [4, 5, 6]

sum_list = [a + b for a, b in zip(list_a, list_b)]
print(sum_list) # [5, 7, 9] 출력
                ## zip 함수를 이용해 튜플 형태로 a 와 b의 리스트를 묶는다. [(1, 4), (2, 5), (3, 6)]
                ### 키와 값을 각 각 항목 a, b에 할당하여 표현식에서 이를 더한 값을 리턴하여 새로운 리스트로 반환한다.

 

 * zip 함수에 대해 추가로 말하자면 크게 팩(packing)과 언팩(unpacking)의 기능을 수행한다.

위의 예에서는 zip 함수의 팩 기능을 수행한 것을 볼 수 있는데, 이는 반복가능개체를 입력받아, 각 개체가 담고 있는 원소들을 튜플 형태로 묶어서 차례대로 반환하는 것을 의미한다. 이를 팩(packing)이라고 한다.

 

 반대로 언팩(unpacking)은 zip 함수와 연산자 * 를 이용해 묶인 튜플들을 원래의 리스트로 되돌리는 과정을 말한다.

* 연산자는 zipped 리스트가 각 원소(튜플)를 zip 함수에 개별적인 입력으로 전달한다.

zip 함수는 입력받은 원소(튜플)에 대해 각 각 list1, list2에 할당함으로써 원래의 리스트를 복구하게 된다. 

zipped = [(1, 'a'), (2, 'b'), (3, 'c')]
list1, list2 = zip(*zipped)
print(list1)  # (1, 2, 3) 반환
print(list2)  # ('a', 'b', 'c') 반환

 


리스트 내포문에 대해 알아보았다.

 

리스트 내포문은 반복가능객체를 통해 기존의 리스트를 새로운 리스트로 반환하는 동작을 수행한다.

 

이 과정에서 연산자, 특정 조건 등을 활용하여 새로운 리스트를 생성하기도 하였고,

두 리스트, 혹은 중첩된 리스트를 하나의 리스트로 생성하기도 하였다.

 

이처럼 다양한 방식으로 리스트 내포문을 활용하여 간결하게 리스트를 생성할 수 있다.

 

 

 

'[파이썬] > 내포문' 카테고리의 다른 글

[파이썬][내포문] 딕셔너리 내포문  (0) 2023.11.07