Python으로 목록 내포를 작성하는 방법

이 게시물은 원래 my website에 게시되었습니다. 더 멋진 콘텐츠를 확인하세요!

Python 스크립트에서 작성하게 될 가장 일반적인 블록 중 하나는 for 루프입니다. for 루프를 사용하면 블록에서 동일한 명령 세트를 반복해서 반복할 수 있습니다. Python의 for 루프는 컬렉션의 모든 항목에 대한 지침을 반복하는 foreach 루프입니다. 이러한 컬렉션을 반복자라고 하며 Python 루프가 반복할 수 있는 항목이며 가장 일반적인 반복자는 list 입니다.

For 루프



for 루프의 예를 살펴보겠습니다. 1에서 n까지 각 숫자의 제곱을 인쇄하는 함수를 작성하십시오.

def write_squares(n):
    for number in range(n):
        square = number ** 2
        print(square)

write_squares(6)



위의 예에서 얻을 수 있는 결과는 다음과 같습니다.

0
1
4
9
16
25


write_squares에서 변수 square를 계산하고 range(n)에서 0까지의 모든 숫자인 n의 각 값에 대해 출력합니다.



이와 같은 작은 for 루프는 Python 스크립트에서 매우 일반적입니다. 예를 들어 파일에서 줄을 읽고 각 줄에서 공백을 제거할 수 있습니다.

def lines_from(filename):
    with open(filename, "r") as file_obj:
        original_lines = file_obj.readlines()

    stripped_lines = []
    for line in original_lines:
        new_line = line.strip()
        stripped_lines.append(new_line)



또는 ID 목록이 있고 각 ID에 대한 데이터 조각을 가져오려고 할 수 있습니다.

def email_addresses(ids):
    addresses = []
    for identifier in ids:
        data = api_request(identifier)
        email_address = data["email"]
        addresses.append(email_addresses)



각 for 루프를 사용하여 목록의 각 항목에 대해 동일한 코드를 실행하고 있습니다. 반복되는 코드 조각이 너무 복잡하지는 않지만 코드 블록이 수행하는 작업을 이해하려면 여전히 여러 줄을 쓰거나 읽어야 합니다. 목록 내포는 기존 목록에서 목록을 만드는 우아한 방법입니다.

목록 이해력



먼저 간단한 예를 살펴보겠습니다.

chars = [letter for letter in "Hello, world!"]
print(chars)



이 Python 코드를 실행하면 출력은 다음과 같습니다.

['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!']



이 예에서는 문자열 chars 의 각 항목을 포함하는 "Hello, world!" 라는 새 목록이 생성됩니다. 문자열의 항목은 문자이므로 chars는 문자열의 모든 문자 목록입니다.

목록 이해 구문



목록 내포는 다음과 같이 작성됩니다.

new_list = [expression for item in old_list]



이것은 전통적인 목록으로 "언래핑된"목록 내포는 다음과 같습니다.

new_list = []
for item in old_list:
    new_item = expression
    new_list.append(new_item)



올바르게 사용하면 목록 내포는 for 루프를 더 읽기 쉬운 한 줄 표현식으로 줄일 수 있습니다.





list comprehension을 사용하여 이전 예제를 다시 작성해 봅시다. 완전히 새로운 함수를 작성하는 대신 예제write_squares를 한 줄로 줄일 수 있습니다.

squares = [number ** 2 for number in range(6)]
print(squares)



이 코드를 실행할 때 동일한 결과를 얻습니다.

0
1
4
9
16
25



이제 라인 스트리핑 기능을 살펴보겠습니다. 파일 내용을 읽으려면 처음 몇 줄을 유지해야 하지만 각 제거된 줄을 새 변수에 추가하는 for 루프는 대신 목록 이해를 사용하도록 업데이트되었습니다.

def lines_from(filename):
    with open(filename, "r") as file_obj:
        original_lines = file_obj.readlines()

    return [line.strip() for line in original_lines]



이메일 주소 불러오기는 한 줄로 줄일 수 있으며 다른 코드 블록에 직접 배치할 수 있습니다.

def email_addresses(ids):
    return [api_request(id)["email"] for id in ids]



조건부



List Comprehension은 조건문을 사용하여 새 목록에 추가되는 값을 필터링하거나 수정할 수도 있습니다. 예를 들어, 1에서 20까지의 정수만 있는 목록을 원하면 목록 내포 끝에 조건문을 추가할 수 있습니다.

>>> evens = [num for num in range(0, 20) if num % 2 == 0]
>>> print(evens)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]



List Comprehension은 조건부에서 andor 연산자를 얼마든지 사용할 수 있습니다. 예를 들어 조건부(num % 2 == 0) and (num % 3 == 0)를 사용하여 2와 3으로 나누어지는 숫자만 유지할 수 있습니다.

>>> my_nums = [num for num in range(0, 20) if (num % 2 == 0) and (num % 3 == 0)]
>>> print(my_nums)

[0, 6, 12, 18]



키 포인트



목록 이해는 기존 목록에서 새 목록을 만드는 우아한 방법입니다. List Comprehension은 여러 줄 코드 블록을 단 한 줄로 줄일 수 있습니다! 그러나 코드 판독기의 가독성이 떨어질 수 있으므로 큰 목록 이해를 작성하지 마십시오.

목록 이해에 익숙해지면 사전에서 작동한다는 점을 제외하면 목록 이해와 매우 유사한 학습dictionary comprehensions을 권장합니다.

좋은 웹페이지 즐겨찾기