소개
리스트 컴프리헨션은 기존의 리스트를 기반으로하는 간결한 방법을 제공합니다. 리스트 컴프리헨션을 사용할 때는 문자열 및 튜플을 포함한 모든 이터러블을 활용하여 리스트를 구축할 수 있습니다.
구문적으로, 리스트 컴프리헨션은 표현식을 포함하는 이터러블이 먼저 나오고 그 뒤에 for
절이 따릅니다. 추가로 for
또는 if
절이 뒤에 나올 수 있으므로, for 루프와 조건문에 대한 이해가 리스트 컴프리헨션을 더 잘 이해하는 데 도움이 됩니다.
데이터 유형을 만드는 대체 구문으로서 리스트 및 다른 순차적인 구조를 만드는 데 대체 구문을 제공합니다. 반복의 다른 방법으로는 for
루프와 같은 반복 방법을 사용하여 리스트를 만들 수도 있지만, 프로그램에서 사용되는 줄 수를 제한할 수 있는 리스트 표현식이 선호될 수 있습니다.
필수 조건
컴퓨터 또는 서버에 Python 3가 설치되어 있고 프로그래밍 환경이 설정되어 있어야 합니다. 프로그래밍 환경을 설정하지 않았다면 운영 체제(Ubuntu, CentOS, Debian 등)에 적합한 로컬 프로그래밍 환경 또는 서버에 프로그래밍 환경을 설치하는 방법에 대한 설치 및 설정 가이드를 참조할 수 있습니다.
리스트 표현식
Python에서는 리스트 표현식을 다음과 같이 구성합니다:
정보: 이 자습서의 예제 코드를 따라가려면 로컬 시스템에서 python3
명령을 실행하여 Python 대화형 셸을 엽니다. 그런 다음 >>>
프롬프트 뒤에 예제를 복사, 붙여 넣거나 편집할 수 있습니다.
A list, or other iterable, is assigned to a variable. Additional variables that stand for items within the iterable are constructed around a for
clause. The in
keyword is used as it is in for
loops, to iterate over the iterable
.
문자열을 기반으로 리스트를 생성하는 예제를 살펴 보겠습니다:
여기서 새로운 리스트는 변수 shark_letters
에 할당되고, letter
는 이터러블 문자열 'shark'
에 포함된 항목들을 대신합니다.
새로운 리스트 shark_letters
가 어떻게 보이는지 확인하기 위해 print()
를 호출하고 다음 출력을 받습니다:
Output['s', 'h', 'a', 'r', 'k']
리스트 내포로 생성한 리스트는 문자열 'shark'
의 항목으로 구성되어 있으며, 즉, 각 문자에 대한 하나의 문자열입니다.
리스트 내포는 for
루프로 다시 작성될 수 있지만, 모든 for
루프가 리스트 내포로 다시 작성될 수 있는 것은 아닙니다.
위에서 shark_letters
리스트를 생성한 리스트 내포를 for
루프로 다시 작성해 보겠습니다. 이것은 리스트 내포가 어떻게 작동하는지 더 잘 이해하는 데 도움이 될 수 있습니다.
리스트를 for
루프로 생성할 때는 코드 블록의 첫 번째 줄과 같이 빈 리스트로 변수를 초기화해야 합니다. 그 다음 for
루프는 'shark'
라는 반복 가능한 문자열에서 변수 letter
를 사용하여 반복합니다. for
루프 내에서, 문자열 내의 각 항목은 list.append(x)
메소드를 사용하여 리스트에 추가됩니다.
리스트 컴프리헨션을 for
루프로 다시 작성하면 같은 결과를 얻을 수 있습니다:
Output['s', 'h', 'a', 'r', 'k']
리스트 컴프리헨션은 for
루프로 다시 작성할 수 있으며, 일부 for
루프는 코드를 더 간결하게 만들기 위해 리스트 컴프리헨션으로 다시 작성될 수 있습니다.
리스트 컴프리헨션과 조건문 사용하기
리스트 컴프리헨션은 조건문을 사용하여 존재하는 리스트나 다른 순차적 데이터 유형을 수정하면서 새로운 리스트를 생성할 수 있습니다.
리스트 컴프리헨션에서 if
문을 사용한 예를 살펴보겠습니다:
리스트 내포는 튜플 fish_tuple
을 기반으로 새로운 리스트 fish_list
를 만듭니다. for
와 in
키워드가 사용되며, 앞서 섹션에서와 같이 사용됩니다. 이제 if
문이 추가되었습니다. if
문은 문자열 'octopus'
와 동등하지 않은 항목만 추가하도록 지정합니다. 따라서 새 리스트는 튜플에서 'octopus'
와 일치하지 않는 항목만 취합니다.
이를 실행하면 fish_list
가 'octopus'
문자열을 제외한 fish_tuple
과 동일한 문자열 항목을 포함하는 것을 알 수 있습니다.
Output['blowfish', 'clownfish', 'catfish']
따라서 우리의 새 리스트는 조건문에 의해 제외된 문자열을 제외한 원래 튜플의 모든 항목을 가지고 있습니다.
수학 연산자, 정수, 그리고 range()
시퀀스 형식을 사용하는 다른 예를 만들겠습니다.
생성되는 리스트 number_list
는 0부터 9까지의 범위의 각 항목의 제곱값으로 채워집니다. 항목의 값이 2로 나누어 떨어지는 경우입니다. 출력은 다음과 같습니다:
Output[0, 4, 16, 36, 64]
리스트 컴프리헨션이 하는 일을 좀 더 자세히 살펴보기 위해, x for x in range(10)
만 호출하는 경우 무엇이 출력될지 생각해 보겠습니다. 우리의 작은 프로그램과 출력물은 아래와 같을 것입니다:
Output[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
이제 조건문을 추가해 보겠습니다:
Output[0, 2, 4, 6, 8]
if
문은 최종 목록에 포함될 항목을 2로 나누어지는 항목으로 제한하여 모든 홀수를 제외했습니다.
마지막으로, 각 x
를 제곱하기 위한 연산자를 추가할 수 있습니다:
이제 이전 목록 [0, 2, 4, 6, 8]
의 각 숫자가 제곱되었습니다:
Output[0, 4, 16, 36, 64]
리스트 컴프리헨션에서 중첩된 if
문도 복제할 수 있습니다:
여기서 리스트 컴프리헨션은 먼저 숫자 x
가 3으로 나누어지는지 확인한 다음 x
가 5로 나누어지는지 확인합니다. x
가 두 요구 사항을 모두 만족하면 출력됩니다. 결과는 다음과 같습니다:
Output[0, 15, 30, 45, 60, 75, 90]
조건부 if
문은 기존 시퀀스에서 어떤 항목이 새로운 목록 생성에 포함되는지를 제어하는 데 사용될 수 있습니다.
리스트 컴프리헨션에서 중첩된 루프
중첩된 루프는 프로그램에서 여러 번 반복 작업을 수행하는 데 사용될 수 있습니다.
이번에는 기존의 중첩된 for
루프 구조를 검토하고 리스트 내포 방식으로 이동해 보겠습니다.
우리의 코드는 2개의 리스트를 순회하고 그들을 기반으로 수학적 연산을 수행하는 새로운 리스트를 생성합니다. 여기 우리의 중첩된 for
루프 코드 블록이 있습니다:
이 코드를 실행하면 다음과 같은 출력을 받게 됩니다:
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]
이 코드는 각 반복에서 첫 번째 리스트의 항목을 두 번째 리스트의 항목으로 곱합니다.
이것을 리스트 내포로 변환하기 위해 각 코드 라인을 한 줄로 압축하고, x * y
연산으로 시작합니다. 이어서 외부 for
루프, 그리고 내부 for
루프가 옵니다. 우리는 리스트 내포 아래에 print()
문을 추가하여 새 리스트가 위에서 생성한 중첩된 for
루프 블록으로 생성된 리스트와 일치하는지 확인할 것입니다:
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]
우리의 리스트 내포는 중첩된 for
루프를 하나의 코드 라인으로 압축하면서 여전히 my_list
변수에 할당할 정확히 같은 리스트를 생성합니다.
리스트 내포는 리스트를 만드는 간결한 방법을 제공하여 여러 줄의 코드를 단일 줄로 축약할 수 있게 해줍니다. 그러나 코드의 가독성이 항상 우선되어야 한다는 것을 명심하는 것이 중요합니다. 따라서 리스트 내포 라인이 너무 길거나 다루기 어려울 때는 루프로 분리하는 것이 좋을 수 있습니다.
결론
리스트 컴프리헨션을 사용하면 하나의 리스트나 다른 시퀀스를 새로운 리스트로 변환할 수 있습니다. 이를 수행하기 위한 간결한 구문을 제공하여 우리의 코드 줄 수를 제한합니다.
리스트 컴프리헨션은 집합 빌더 표기법 또는 집합 컴프리헨션의 수학적 형태를 따르므로 수학적 배경을 가진 프로그래머에게 특히 직관적일 수 있습니다.
리스트 컴프리헨션은 코드를 더 간결하게 만들 수 있지만, 최종 코드가 가능한 한 가독성이 높도록 보장하는 것이 중요합니다. 따라서 매우 긴 단일 코드 라인은 피해야 하며 코드가 사용자 친화적임을 보장해야 합니다.
Source:
https://www.digitalocean.com/community/tutorials/understanding-list-comprehensions-in-python-3