Python List Comprehension 기본 개념 배우기

Python List Comprehension 은 기존의 반복 가능한 객체를 기반으로 새 리스트를 생성하는 간결한 방법이며 리스트 생성을 위한 강력하고 유연한 도구입니다.

이번 포스팅에서는 개념을 더 잘 이해하는 데 도움이 되도록 실제 사례를 통해 Python List Comprehension의 기본 개념을 살펴보겠습니다.

Python List Comprehension 예시

아래 코드는 짝수 리스트를 생성하기 위해 List Comprehension을 사용하는 예입니다.

evenNumbers = [x for x in range(10) if x % 2 == 0]
evenNumbers
----------------------------------------------------
[0, 2, 4, 6, 8]

이 예에서는 List Comprehension을 사용하여 0에서 10 사이의 짝수 리스트를 생성합니다. 대괄호 [x for x in range(10)] 안의 표현식은 0에서 9 사이의 모든 숫자 리스트를 생성합니다.

if 문은 [if x % 2 == 0] 모든 홀수를 필터링하고 리스트에 짝수만 남깁니다. 최종 결과는 짝수 [0, 2, 4, 6, 8]을 포함하는 새로운 리스트입니다.

List Comprehension은 중첩 루프와 함께 사용할 수도 있습니다.

pairs = [(x, y) for x in range(3) for y in range(3)]
pairs
--------------------------------------------------------------------------
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

이 예에서는 두 개의 중첩 루프와 함께 List Comprehension을 사용하여 0과 2 사이의 가능한 모든 숫자 쌍의 리스트를 생성합니다. 대괄호안의 표현식 [(x, y) for x in range(3) for y in range(3) ]는 0과 2 사이의 가능한 모든 숫자 쌍을 포함하는 튜플 리스트를 생성합니다.

최종 결과는 [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] 쌍의 새로운 리스트입니다.

List Comprehension은 조건식과 함께 사용할 수도 있습니다.

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
squares = [x ** 2 for x in numbers if x % 2 == 0]
squares
-------------------------------------------------------
[4, 16, 36, 64]

이 예에서는 List Comprehension을 사용하여 짝수의 제곱 리스트를 생성합니다.

대괄호 [x ** 2 for x in numbers if x % 2 == 0] 안의 표현식은 1과 9 사이의 숫자 중에서 짝수에 대해 제곱한 후 새로운 리스트를 생성합니다. if 문은 [if x % 2 == 0] 모든 홀수를 필터링하여 리스트에 짝수만 남깁니다. 최종 결과는 짝수의 제곱([4, 16, 36, 64])을 포함하는 새로운 리스트입니다.

Python List Comprehension 및 for 루프는 Python에서 반복 가능한 항목을 반복하는 두 가지 일반적인 방법입니다. 두 접근 방식 모두 동일한 작업을 수행하는 데 사용될 수 있지만 두 접근 방식 사이에는 몇 가지 주요 차이점이 있습니다.


List Comprehension vs For 루프

List Comprehension은 기존 iterable에서 새 리스트를 생성하는 간결하고 읽기 쉬운 방법입니다. Iterable을 반복하고, 조건을 적용하고, 한 줄의 코드로 새 리스트를 만드는 데 사용할 수 있습니다.

이를 통해 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만들 수 있습니다. 그러나 대규모 데이터를 처리할 때 List Comprehension은 for 루프보다 효율성이 떨어질 수 있습니다.

반면에 for 루프는 반복 가능한 항목을 반복하는 보다 전통적인 방법입니다. 반복 프로세스에 대한 더 많은 제어 기능을 제공하므로 진행하면서 반복 가능한 항목을 수정하고 조작할 수 있습니다. 이는 어떤 경우에는 List Comprehension보다 더 강력해질 수 있습니다.

그러나 for 루프는 복잡한 반복 논리를 처리할 때 읽기 어렵고 유지 관리가 더 어려울 수 있습니다.


Lambda 함수 vs List Comprehension

Lambda 함수는 단일 입력 값에 대해 간단한 작업을 수행하는 데 사용할 수 있는 익명 함수입니다. 일반적으로 map(), filter() 또는 Reduce()와 같은 다른 함수와 함께 사용됩니다.

Lambda 함수는 간결하고 사용하기 쉽지만 간단한 작업으로 제한되며 새 리스트를 직접 생성하는 데 사용할 수 없습니다.

반면에 List Comprehension은 기존 반복 가능 항목에서 새 리스트를 만드는 데 사용할 수 있는 보다 다양한 도구입니다. 더 복잡한 작업과 필터를 iterable에 적용하는 데 사용할 수 있으므로 더 많은 사용자 정의 리스트를 만들 수 있습니다.

List Comprehension은 Lambda 함수보다 더 장황할 수 있지만 더 강력하고 유연합니다.

요약하자면, List Comprehension과 for 루프는 모두 Python에서 반복 가능한 항목을 반복하는 데 유용한 도구이며 가독성, 유지 관리 용이성 및 효율성 측면에서 서로 다른 절충안을 갖습니다.

Lambda 함수는 단일 입력 값에 대해 간단한 작업을 수행하는 데 유용한 도구이지만 List Comprehension과 같이 새 리스트를 직접 생성하는 데 사용할 수는 없습니다.


Python List Comprehension 구문

List Comprehension은 Python에서 새 리스트를 만드는 간결하고 강력한 방법입니다. Iterable을 반복하고, 각 요소에 표현식을 적용하고, 선택적으로 조건에 따라 요소를 필터링할 수 있습니다.

List Comprehension의 일반적인 구문은 다음과 같습니다.

newList = [표현식 for 요소 in 반복가능한객체 if 조건문]

구문의 각 부분을 설명하겠습니다.

  • newList: 생성하려는 새 리스트 이름
  • 표현식: iterable의 각 요소에 적용하려는 작업 또는 변환
  • 요소: iterable의 각 개별 요소를 나타내는 변수
  • 반복가능한객체: 반복하려는 요소의 모음
  • 조건문: 조건에 따라 반복 가능한 항목에서 특정 요소만 선택하는 필터

이제 List Comprehension이 실제로 어떻게 작동하는지 알아보기 위해 몇 가지 실제 사례를 살펴보겠습니다.


예제 1: 리스트의 숫자 제곱

숫자 리스트가 있고 해당 숫자의 제곱을 포함하는 새 리스트를 만들려면 어떻게 해야 할까요? 이를 달성하기 위해 다음과 같이 List Comprehension을 사용할 수 있습니다.

numbers = [1, 2, 3, 4, 5]
squares = [num ** 2 for num in numbers]
squares
-----------------------------------------------
[1, 4, 9, 16, 25]

이 예에서 숫자는 반복 가능 항목이고 num은 반복 가능 항목의 각 요소를 나타내는 변수입니다. num**2 표현식이 각 요소에 적용되어 제곱 값을 생성합니다. 제곱된 숫자의 결과 리스트는 변수 squares에 저장됩니다.


예제 2: 리스트에서 짝수 필터링

숫자 리스트가 있고 원래 리스트의 짝수만 포함하는 새 리스트를 만들려면 어떻게 해야 할까요?

조건식과 함께 List Comprehension을 사용하면 다음과 같이 이를 달성할 수 있습니다.

numbers = [1, 2, 3, 4, 5]
evens = [num for num in numbers if num % 2 == 0]
evens
-----------------------------------------------------
[2, 4]

이 예에서 조건식 if num % 2 == 0은 원본 리스트를 필터링하여 짝수만 선택합니다. 짝수의 결과 리스트는 evens 변수에 저장됩니다.


List Comprehensions의 중첩 루프

List Comprehension은 중첩 루프 사용을 지원하므로 더 복잡하고 사용자 정의된 리스트를 만들 수 있습니다. 중첩 루프는 본질적으로 루프 내의 루프이며, 외부 루프의 각 반복은 내부 루프의 반복을 트리거합니다.

List Comprehension에서 중첩 루프를 사용하는 일반적인 구문은 다음과 같습니다.

newList = [표현식 for 외부루프 in 외부_반복가능자 for 내부루프 in 내부_반복가능자 if 조건문]

구문의 각 부분을 분석해 보겠습니다.

  • newList: 생성하려는 새 리스트 이름
  • 표현식: iterable의 각 요소에 적용하려는 작업 또는 변환
  • 외부루프: 외부 반복 가능 항목의 각 개별 요소를 나타내는 변수
  • 외부_반복가능자: 반복하려는 외부 반복 가능 항목 리스트
  • 내부루프: 내부 iterable의 각 개별 요소를 나타내는 변수
  • 내부_반복가능자: 반복하려는 내부 반복 가능 항목
  • 조건문: 조건에 따라 반복 가능한 항목에서 특정 요소만 선택하는 필터

이제 List Comprehension에서 중첩 루프가 어떻게 작동하는지 알아보기 위한 예제 코드를 살펴보겠습니다.


예제 1: 2D 목록 평면화

2D 리스트가 있고, 이를 1D 리스트로 병합하고 싶다면 어떻게 해야 할까요? 이를 달성하기 위해 List Comprehension에서 중첩 루프를 다음과 같이 사용할 수 있습니다.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flatList = [num for row in matrix for num in row]
flatList
-----------------------------------------------------
[1, 2, 3, 4, 5, 6, 7, 8, 9]

이 예에서 외부 루프는 행렬의 각 행을 반복하고 내부 루프는 행의 각 요소를 반복합니다. num 표현식을 행렬의 각 요소에 적용하여 평면화된 리스트를 생성합니다.


예 2: 구구단 만들기

특정 숫자까지 구구단을 만들고 싶다면 어떻게 해야 할까요? 이를 달성하기 위해 List Comprehension에서 중첩 루프를 다음과 같이 사용할 수 있습니다.

n = 5
multTable = [[i * j for j in range(1, n + 1)] for i in range(1, n + 1)]
multTable
----------------------------------------------------------------------------
[[1, 2, 3, 4, 5],
 [2, 4, 6, 8, 10],
 [3, 6, 9, 12, 15],
 [4, 8, 12, 16, 20],
 [5, 10, 15, 20, 25]]

이 예에서 외부 루프는 1부터 n까지 각 숫자를 반복하고 내부 루프는 1부터 n까지 각 숫자를 반복하여 곱셈표를 만듭니다. i*j 표현식은 각 숫자 쌍에 적용되어 테이블을 생성합니다.


사용법

List Comprehension은 간결하고 읽기 쉬운 방식으로 리스트를 생성하는 Python의 유용한 도구입니다. 그러나 모든 상황에서 항상 최선의 선택이 될 수는 없습니다.

List Comprehension을 사용해야 하는 상황과 사용하지 말아야 하는 상황은 다음과 같습니다.


List Comprehension을 사용해야 하는 상황


간단한 리스트 만들기

List comprehension은 range나 숫자 리스트와 같은 반복 가능 항목을 기반으로 간단한 리스트를 만드는 데 적합합니다. 단 한 줄의 코드로 리스트를 만들 수 있습니다.


필터링 요소

List comprehension은 조건에 따라 iterable의 요소를 필터링하는 데에도 사용할 수 있습니다. 이는 리스트나 기타 반복 가능 항목에서 특정 요소를 빠르게 추출하는 좋은 방법입니다.


매핑 요소

List comprehension은 iterable의 각 요소에 함수를 적용하고 결과에 따라 새 리스트를 만드는 데에도 사용할 수 있습니다. 이는 리스트를 변환하는 빠르고 읽기 쉬운 방법입니다.


가독성 향상

List comprehension은 코드를 더 간결하고 이해하기 쉽게 만들어 코드의 가독성을 향상시키는 좋은 방법이 될 수 있습니다. 여러 줄의 코드를 단 한 줄로 대체할 수 있는 경우가 많습니다.



List Comprehension을 사용하지 말아야 하는 상황


복잡한 로직

리스트를 생성하는 논리가 너무 복잡하거나 조건이 너무 많으면 대신 일반 루프를 사용하는 것이 더 나을 수 있습니다. 이렇게 하면 코드가 더 읽기 쉽고 이해하기 쉬워집니다.


대규모 리스트

매우 큰 리스트를 만들어야 하는 경우 List Comprehension 대신 생성기 표현식을 사용하는 것이 더 나을 수 있습니다. 이렇게 하면 리스트를 느리게 생성하여 메모리를 절약하고 성능을 향상시킬 수 있습니다.


부작용

List Comprehension에 전역 변수 수정이나 출력 인쇄와 같은 부작용이 포함된 경우 대신 일반 루프를 사용하는 것이 더 나을 수 있습니다. 이렇게 하면 코드를 더 예측하기 쉽고 디버깅하기가 더 쉬워집니다.

요약하자면, List Comprehension은 간단한 리스트를 만들고, 요소를 필터링 및 매핑하고, 코드 가독성을 향상시키는 데 유용한 도구입니다. 그러나 이는 모든 상황, 특히 복잡한 논리, 큰 리스트 및 부작용이 있는 코드에 대해 최선의 선택이 아닐 수도 있습니다. 코드의 특정 요구 사항을 고려하고 작업에 가장 적합한 도구를 선택하는 것이 항상 중요합니다.


Tips & Tricks

다음은 Python List Comprehension을 보다 효과적으로 사용하는 데 도움이 되는 몇 가지 팁과 요령입니다.


단순성 유지

List Comprehension은 강력한 도구가 될 수 있지만 현명하게 사용하는 것이 중요합니다. List Comprehension을 읽고 이해하기 어려운 형태로 너무 복잡하게 만들지 말아야 합니다.


의미 있는 변수 이름 사용

List Comprehension을 생성할 때 의미 있는 변수 이름을 사용해야 합니다. 이를 통해 반복 가능 요소, 필터 및 맵 요소를 기반으로 리스트를 생성하고 코드 가독성을 향상시킬 수 있습니다. 빠르고 읽기 쉬운 방법을 제공함으로써 코드를 더욱 간결하고 읽기 쉽고 이해하기 쉽게 만들 수 있습니다.


효율성 고려

List Comprehension은 강력한 도구일 수 있지만 사용할 때 효율성을 고려하는 것이 중요합니다. 어떤 경우에는 for 루프나 다른 데이터 구조를 사용하는 것이 더 효율적일 수 있습니다.


조건식 사용

조건식은 List Comprehension에 유용할 수 있지만 코드를 더 복잡하게 만들 수도 있습니다. 현명하게 사용하고 코드에 가치를 추가할 수 있어야 합니다.


연습, 연습, 연습

다른 프로그래밍 기술과 마찬가지로 List Comprehension에 능숙해지는 가장 좋은 방법은 연습입니다. 다양한 예제를 실험하고 List Comprehension을 사용하여 코드를 단순화하는 방법을 계속 생각해야 합니다.


결론

Python List Comprehension는 기존 반복 가능한 개체를 기반으로 새 리스트를 만드는 유용하고 효율적인 방법입니다. 이는 코드를 단순화하고 리스트 생성 시 더 큰 유연성을 허용합니다.

연습을 통해 이 기능을 익히고 일상적인 코딩 프로젝트에 사용하여 시간과 노력을 절약할 수 있습니다.

이번 포스팅이 Python List Comprehension의 기본 사항과 이를 사용하여 더욱 깔끔하고 효율적인 코드를 작성하는 방법을 이해하는 데 도움이 되었으면 합니다.

감사합니다.


답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다