웹사이트 검색

Python 3의 목록 이해 이해


소개

목록 내포는 튜플을 만드는 간결한 방법을 제공합니다.

구문적으로 목록 내포는 for 절이 뒤에 오는 표현식을 포함하는 반복 가능 항목으로 구성됩니다. 이것은 추가 for 또는 if 절이 뒤따를 수 있으므로 조건문에 익숙하면 목록 이해를 더 잘 이해하는 데 도움이 됩니다.

목록 내포는 목록 및 기타 순차 데이터 유형을 만들기 위한 대체 구문을 제공합니다. for 루프와 같은 다른 반복 방법을 사용하여 목록을 만들 수도 있지만 프로그램에서 사용되는 줄 수를 제한할 수 있으므로 목록 내포가 선호될 수 있습니다.

전제 조건

컴퓨터나 서버에 Python 3이 설치되어 있고 프로그래밍 환경이 설정되어 있어야 합니다. 프로그래밍 환경이 설정되지 않은 경우 운영 체제(Ubuntu, CentOS, Debian 등)에 적합한 서버의 프로그래밍 환경에 대한 설치 및 설정 가이드를 참조할 수 있습니다.

목록 이해

Python에서 목록 내포는 다음과 같이 구성됩니다.

정보: 이 자습서의 예제 코드를 따라하려면 python3 명령을 실행하여 로컬 시스템에서 Python 대화형 셸을 엽니다. 그런 다음 >>> 프롬프트 뒤에 추가하여 예제를 복사, 붙여넣기 또는 편집할 수 있습니다.

list_variable = [x for x in iterable]

목록 또는 기타 이터러블은 변수에 할당됩니다. iterable 내의 항목을 나타내는 추가 변수는 for 절 주위에 구성됩니다. in 키워드는 iterable을 반복하기 위해 for 루프에서 그대로 사용됩니다.

문자열을 기반으로 목록을 만드는 예제를 살펴보겠습니다.

shark_letters = [letter for letter in 'shark']
print(shark_letters)

여기서 새 목록은 변수 shark_letters에 할당되고 letter는 반복 가능한 문자열 shark에 포함된 항목을 나타내는 데 사용됩니다.

새 목록 shark_letters가 어떻게 생겼는지 확인하기 위해 print()를 호출하고 다음 출력을 받습니다.

Output
['s', 'h', 'a', 'r', 'k']

list comprehension으로 만든 목록은 문자열 shark의 항목, 즉 각 문자에 대한 문자열로 구성됩니다.

목록 내포는 for 루프로 다시 작성할 수 있지만 모든 for 루프를 목록 내포로 다시 작성할 수 있는 것은 아닙니다.

위의 shark_letters 목록을 생성한 목록 이해를 사용하여 for 루프로 다시 작성해 보겠습니다. 이것은 목록 이해가 어떻게 작동하는지 더 잘 이해하는 데 도움이 될 수 있습니다.

shark_letters = []

for letter in 'shark':
    shark_letters.append(letter)

print(shark_letters)

for 루프로 목록을 만들 때 목록에 할당된 변수는 코드 블록의 첫 번째 줄에 있으므로 빈 목록으로 초기화해야 합니다. 그런 다음 for 루프는 반복 가능한 문자열 shark의 변수 letter를 사용하여 항목을 반복합니다. for 루프 내에서 문자열 내의 각 항목은 list.append(x) 메서드를 사용하여 목록에 추가됩니다.

목록 내포를 for 루프로 다시 작성하면 동일한 출력이 제공됩니다.

Output
['s', 'h', 'a', 'r', 'k']

List Comprehension은 for 루프로 재작성할 수 있으며 일부 for 루프는 코드를 더 간결하게 만들기 위해 List Comprehension으로 재작성할 수 있습니다.

List Comprehension과 함께 조건문 사용

List Comprehension은 조건문을 활용하여 새 목록을 만들 때 기존 목록 또는 기타 순차적 데이터 유형을 수정할 수 있습니다.

목록 이해에 사용되는 if 문의 예를 살펴보겠습니다.

fish_tuple = ('blowfish', 'clownfish', 'catfish', 'octopus')

fish_list = [fish for fish in fish_tuple if fish != 'octopus']
print(fish_list)

list comprehension은 튜플 fish_tuplefish_list라는 새 목록의 기반으로 사용합니다. 위 섹션에서와 같이 forin 키워드가 사용되었으며 이제 if 문이 추가되었습니다. if 문은 문자열 octopus와 일치하지 않는 항목만 추가하도록 지시하므로 새 목록은 와 일치하지 않는 튜플의 항목만 가져옵니다. 문어.

이것을 실행하면 fish_listoctopus 문자열이 생략되었다는 사실을 제외하고는 fish_tuple과 동일한 문자열 항목이 포함되어 있음을 알 수 있습니다. :

Output
['blowfish', 'clownfish', 'catfish']

따라서 새 목록에는 조건문에서 제외된 문자열을 제외한 원래 튜플의 모든 항목이 있습니다.

range() 시퀀스 유형을 사용하는 또 다른 예제를 만들 것입니다.

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

생성 중인 목록인 number_list는 항목의 값이 2로 나누어지는 경우 0-9 범위의 각 항목의 제곱 값으로 채워집니다. 출력은 다음과 같습니다.

Output
[0, 4, 16, 36, 64]

list comprehension이 수행하는 작업을 좀 더 분석하기 위해 x for x in range(10)만 호출하는 경우 출력되는 내용에 대해 생각해 봅시다. 우리의 작은 프로그램과 출력은 다음과 같습니다.

number_list = [x for x in range(10)]
print(number_list)
Output
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

이제 조건문을 추가해 보겠습니다.

number_list = [x for x in range(10) if x % 2 == 0]
print(number_list)
Output
[0, 2, 4, 6, 8]

if 문은 모든 홀수를 생략하고 2로 나눌 수 있는 항목만 포함하도록 최종 목록의 항목을 제한했습니다.

마지막으로 연산자를 추가하여 각 x를 제곱할 수 있습니다.

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

따라서 [0, 2, 4, 6, 8]의 이전 목록에 있는 각 숫자는 이제 제곱됩니다.

Output
[0, 4, 16, 36, 64]

목록 내포와 함께 중첩된 if 문을 복제할 수도 있습니다.

number_list = [x for x in range(100) if x % 3 == 0 if x % 5 == 0]
print(number_list)

여기서 목록 내포는 숫자 x가 3으로 나누어 떨어지는지 먼저 확인한 다음 x가 5로 나누어 떨어지는지 확인합니다. 는 인쇄할 두 가지 요구 사항을 모두 충족하며 출력은 다음과 같습니다.

Output
[0, 15, 30, 45, 60, 75, 90]

조건부 if 문을 사용하여 새 목록 생성에 포함되는 기존 시퀀스의 항목을 제어할 수 있습니다.

List Comprehension의 중첩 루프

중첩 루프는 프로그램에서 여러 반복을 수행하는 데 사용할 수 있습니다.

이번에는 기존의 중첩된 for 루프 구성을 검토하고 목록 이해를 위해 작업할 것입니다.

우리의 코드는 2개의 목록을 반복하고 이를 기반으로 수학 연산을 수행하는 새 목록을 생성합니다. 다음은 중첩된 for 루프 코드 블록입니다.

my_list = []

for x in [20, 40, 60]:
	for y in [2, 4, 6]:
		my_list.append(x * y)

print(my_list)

이 코드를 실행하면 다음과 같은 결과가 나타납니다.

Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

이 코드는 각 반복에 대해 첫 번째 목록의 항목을 두 번째 목록의 항목으로 곱합니다.

이를 목록 내포로 변환하기 위해 각 코드 줄을 x * y 연산으로 시작하는 한 줄로 압축합니다. 그 다음에는 외부 for 루프와 내부 for 루프가 차례로 옵니다. 목록 내포 아래에 print() 문을 추가하여 새 목록이 위의 중첩된 for 루프 블록으로 만든 목록과 일치하는지 확인합니다.

my_list = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]
print(my_list)
Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

우리의 목록 이해는 my_list 변수에 할당할 정확히 동일한 목록을 생성하면서 중첩된 for 루프를 가져와 한 줄의 코드로 병합합니다.

목록 내포는 목록을 만드는 간결한 방법을 제공하므로 여러 줄의 코드를 한 줄로 추출할 수 있습니다. 그러나 우리 코드의 가독성이 항상 우선시되어야 한다는 점을 명심할 가치가 있습니다. 따라서 목록 이해 줄이 너무 길어지거나 다루기 어려워지면 루프로 나누는 것이 가장 좋을 수 있습니다.

결론

목록 이해를 통해 하나의 목록 또는 다른 시퀀스를 새 목록으로 변환할 수 있습니다. 이 작업을 완료하기 위한 간결한 구문을 제공하여 코드 라인을 제한합니다.

목록 내포는 set-builder 표기법 또는 집합 내포의 수학적 형식을 따르므로 수학적 배경이 있는 프로그래머에게 특히 직관적일 수 있습니다.

목록 이해가 코드를 더 간결하게 만들 수 있지만 최종 코드를 가능한 한 읽을 수 있도록 하는 것이 중요하므로 코드가 사용자 친화적인지 확인하기 위해 매우 긴 한 줄의 코드는 피해야 합니다.