Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Python
Code

List Comprehensions in Python

by
Difficulty:IntermediateLength:MediumLanguages:

Korean (한국어) translation by Simon Yim (you can also view the original English article)

List comprehensions (리스트 축약이라고 번역도 합니다만, 적절한 단어를 못 찾아 영문 그대로 표기를 합니다.)는for 반복문을 보다 간결히 사용할 수 있는 방법을 제공합니다. 이것들은 기존의 리스트나 반복처리 가능한 객체에서 새로운 리스트을 만들기를 원할때 유용할 수 있습니다. 예를 든다면, 한 숫자들의 리스트로부터 각각의 제곱의 리스트를 만들기 위하여 list comprehensions를 사용할 수 있습니다. 비슷하게, 한 숫자들의 리스트상에 어떤 조건을 사용하여 새로운 리스트를 만들수 있습니다. 이때 새로운 리스트는 원래 리스트의 부분집합 입니다. 

한가지 명심할 것은, 모든 for 반복문을 list comprehension 으로 작성할 수 없다는 것 입니다. 한가지 더 말하자면, "List comprehension" 이란 말은 약간 오해하기 쉽습니다. 왜냐하면 comprehension 이 단지 리스트와 동작한다는 의미를  제시하는 것 같기 때문입니다.  사실은 list comprehension 에서의 "list"란 단어는, 파이썬에서 어떤 반복할 수 있는 객체상에서 반복문을 사용할 수 있고, 그 결과물이 한개의 list로 될수 있다는 것을 나타냅니다.  

반복문과 List Comprehensions

내부에 어떤 조건문도 사용하지 않은, 가장 기본적인 List Comprehensions은 다음과 같은 형태입니다.

자, 1에서 15까지 각각 5를 곱한 리스트를,  가장 기본적인 for 반복문을 사용하여 작성하여 봅시다. 첫째, 우리는 빈 리스트를 만들어야 합니다. 그리고, 1에서 15 각각에 5를 곱하는 것을 반복하여야 합니다. 우리가 얻은 숫자들의 새로운 시퀀스(리스트)는 5의 배수로 구성 됩니다. 

위의 for 반복문은 기본적으로 다음의 구조 입니다.

앞서 보았던 list comprehension 형태와 비교해 본다면, <the_element>n, <the_iterable>range(1,16) , 그리고 <the_expression> n*5 입니다. 이 값들을 list comprehension 안에 넣는다면 다음의 결과를 얻을 수 있습니다.

비슷하게, 다음과 같이 주어진 숫자들의 세제곱 값을 가지는 리스트를 얻을 수 있습니다.

List Comprehensions안의 조건문

또한 우리는 최종 리스트로부터 특정한 값들을 걸러내기 위한 if 조건문을 사용할 수 있습니다.

이러한 형태의 기본적인 예로는 주어진 범위안에 모든 짝수만을 골라내는 것이 될수 있습니다. 이러한 목적을 위하여 사용한 for 반복문은 아래와 같습니다. 

같은 작업을 다음의 list comprehension을 사용하여 수행 할 수 있습니다. 

더 복잡한 list comprehension 을 사용한 예는, list comprehension안에 .. if .. else .. 조건 표현식을 추가한 것이 될 수 있습니다.

이경우에는, list comprehension안에  문장들의 순서가 보통의if조건문과 다르게 됩니다. 단지 if 조건문만을 사용 할 때는, 조건문을 list comprehension에 제일 끝에 오게 됩니다.  그러나,  .. if .. else .. 표현을 사용하는 경우에는 for 반복문과 조건표현식의 위치가 서로 바꾸어 줍니다. 새로운 순서는 다음과 같습니다. 

자 이제 이 수다스러운 .. if .. else .. 조건 표현식을 사용하여 주어진 범위의 숫자중, 짝수는 제곱, 홀수는 세제곱한 결과를 구하여 봅시다. 

위의 조건 표현식은 다음의 구조 입니다:

알맞는 자리에 대응하는 값들을 집어 넣으면, 다음의 list comprehension 이 됩니다.  

중첩된 반복문을 위한 List Comprehension 

물론 하나의 list comprehension 안에 중첩된 반복문을 사용할 수 있습니다. 하나의 list comprehension 안에 넣을 수 있는 반복문의 갯수에는 제한이 없습니다. 그러나 반복문의 순서는 원래 코드 (for 반복문을 사용한 코드)와 list comprehension 모두 반드시 같아야만 한다는 것을 명심하기 바랍니다.   또한 각각의 for 반복문 다음에, 필요하다면 if 조건 표현식을 추가 할 수 있습니다. 중첩된 for 반복문을 사용한 list comprehension은 다음과 같은 구조입니다. 

다음 예를 보면, 모든 것이 보다 명확할 것 입니다. 두개의 중첩된 반복문이 있고, 서로 곱하기를 하여서 곱셈표를 작성합니다. 

이 중첩된 for반복문은 다음과 같이 다시 작성할 수 있습니다. 

일단 이러한 형태로 반복문을 작성 하였다면, list comprehension으로 바꾸는 것은 쉽습니다. 

리스트들을 원소로 가지는 리스트를 펼치기 위하여, 위와 비슷한  list comprehension을 사용할 수 있습니다. 바깥쪽 for 반복문은 개별적인 리스트들을 통하여 반복되고, 이것들을 row 변수 안에  저장합니다. 안쪽의 for 반복문은 현재 row 변수안에 모든 요소들 사용하여 반복 됩니다. 첫번제 반복할 동안에 row 변수는 [1,2,3,4] 값을 가집니다.  The second loop iterates through this list or row and appends all those values to the final list.

중첩된 List Comprehensions

아마도, 중첩된 list comprehension 은 중첩 반복문으로 구성된 list comprehension 과 비슷하게 보일 수도 있습니다. 그러나 두가지는 많이 다릅니다. 첫번째 경우는, 반복문 안에 반복문을 다룰 때 입니다.  이 경우에서, 우리는 list comprehension 안에 list comprehension을 가지고다루어 보겠습니다. 중첩된 list comprehension 사용의 좋은 예는 앞 절에서의 메트릭스의 변환을 만드는 것이겠습니다. 

list comprehension 표현없이, 변환을 하기 위하여 두개의 for 반복문 사용하는 것이 필요합니다. 

바깥쪽 반복문은, 매트릭스에 4개의 행이 있기 때문에 매트릭스를 통틀어 4번 반복합니다. 안쪽의 반복문은 한번에 현재 열안의 요소들을 한번에 한 인덱스씩 모두 반복하고, temp라고 하는 임시 리스트에 이것을 첨부합니다.   그리고 이 temp 리스트는 전환되는 매트릭스에 한 열로 추가 됩니다. 중첩된 list comprehension 의 경우에는, 가장 바깥쪽 반ㅂ복문이 가장 끝에 오게 되며, 가장 안쪽의 반복문이 시작위치에 오게 됩니다. 

이러한 형태의 list comprehension로 위의 코드가 여기에 있습니다.

이것을 보는 다른 방법은, 이글의 처음 부분에 배웠던 것과 같이 기본적인 for 반복문을 대체하여 list comprehension의 구조로 생각하는 것입니다. 

만일 그러한 방법을 위의 중첩된 list comprehension과 비교한다면, 이경우에서는 <the_expression>이 실제로 다른 list comprehension: [row[n] for row in matrix] 인 것을 볼수 있습니다. 이 중첩된 list comprehension 자체가 기본적인 for 반복문의 형태 안에 있습니다.

마지막 고려사항

저는 이글이 list comprehension이 무엇이고, 리스트를 만들때, 보다 간결하고 조금 빠르게 코드를 작성하기 위하여, 어떻게 기본적인 for 반복문을 대신하여 list comprehension을 사용하는지 이해 하는데 도움 되기를 바랍니다. 

명심하여야 할 또 다른 하나는 코드의 가독성-얼마나 읽기 쉬운지 입니다.  중첩된 반복문을 위하여 list comprehension을 작성하면 코드의 가독성이 떨어집니다. 이러한 경우에는, 가독성을 향상하기 위하여 list comprehension을 여러라인으로 나누어 줄 수 있습니다.

덧붙여서, 판매를 위해서와 공부를 위해서 Envato Market 에 무엇이 가능한지 주저하지 마시고 보시기 바랍니다.그리고 어떤 질문이든지 주저하지 마시고 물어보아 주시고, 아래 feed란을 사용하여 여러분의 귀중한 피드백 주시기 바랍니다.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.