HOWTO · Python

Python 배열의 길이 가져오기

이 문서에서는 len() 함수 또는 __len__() 메서드를 사용하여 파이썬 객체의 길이를 찾는 방법을 소개합니다.

이 페이지의 내용

Python 배열이나 리스트의 길이는 보통 len()를 한 번 호출하면 알 수 있습니다. 이 함수는 리스트, 튜플, 문자열, 딕셔너리, array.array처럼 길이가 정해진 객체의 항목 수를 반환합니다. Python의 길이 프로토콜을 사용하면 사용자 정의 클래스에서도 인스턴스의 길이를 정할 수 있습니다. 제너레이터를 포함한 일부 이터레이터는 길이가 정해져 있지 않으므로 다른 방법을 사용해야 합니다.

Python 리스트의 길이를 len()로 구하기

리스트를 내장 len() 함수에 전달하세요. 반환값은 리스트에 어떤 값이 들어 있는지와 관계없이 요소 수를 나타내는 정수입니다.

다음 예제를 실행해 보세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

my_list = [1, 2, 3, 4, 5]
length_of_list = len(my_list)
print(length_of_list)

이 예제는 리스트의 항목 수를 출력합니다. 문자열, 숫자 또는 다른 객체가 들어 있는 리스트에도 같은 방법을 사용할 수 있습니다. 결과는 가장 바깥쪽 리스트의 요소 수입니다. 리스트 안에 중첩 리스트가 있어도 len()는 그 안쪽 요소까지 합산하지 않습니다.

다른 Python 객체의 길이 구하기

len()는 길이를 제공하는 객체에 사용할 수 있습니다. 문자열에서는 유니코드 코드 포인트 수를 반환합니다. 하나의 사용자가 인식하는 문자가 여러 코드 포인트로 이루어져 있다면, 반환값이 사용자가 인식하는 문자 수와 다를 수 있습니다. 딕셔너리에서는 키의 수를 셉니다. 튜플, 집합, 바이트 객체, array.array도 항목 수를 제공합니다. 예를 들어 len("Python")은 해당 문자열의 코드 포인트 수를 반환하고, len({"name": "Ada", "language": "Python"})은 두 키를 셉니다.

이터러블이라고 해서 반드시 길이가 있는 것은 아닙니다. len()는 임의의 이터러블을 순회하며 항목을 세지 않고, 객체에 크기를 묻습니다. 따라서 객체가 이미 항목 수를 알고 있을 때 유용하지만, 값의 스트림을 세는 보편적인 방법은 아닙니다. 모든 호출의 성능이 같다고 가정하지 마세요. 비용은 객체의 구현 방식에 따라 달라집니다.

len()와 __len__()의 관계

내장 len(obj)은 Python의 길이 프로토콜을 사용합니다. 클래스는 보통 특수 메서드 __len__()를 정의해 이 프로토콜을 구현합니다. 이 메서드는 인스턴스의 항목 수를 나타내는 0 이상의 정수를 반환합니다. 일반적인 애플리케이션 코드에서는 obj.__len__()을 직접 호출하지 말고 len(obj)을 사용하세요. 내장 함수는 표준 인터페이스이며 내장 타입에도 사용할 수 있고, Python이 일반적인 특수 메서드 조회 규칙을 적용하도록 합니다.

값을 리스트에 저장하는 간단한 사용자 정의 클래스는 다음과 같습니다:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

class CustomList:
    def __init__(self, elements):
        self.elements = elements

    def __len__(self):
        return len(self.elements)

my_custom_list = CustomList([1, 2, 3, 4, 5])
print(len(my_custom_list))

이 클래스는 내부에 저장된 리스트에 길이 계산을 맡기며, 호출하는 쪽에서는 익숙한 len() 인터페이스를 사용합니다. 사용자 정의 구현은 보고하는 길이가 객체의 실제 내용과 일치하도록 해야 합니다. __len__()를 정의해도 관련 없는 객체에 길이가 생기는 것은 아니며, len()를 호출한다고 해서 예외가 일반적으로 방지되는 것도 아닙니다.

길이가 없는 객체 다루기

제너레이터와 그 밖의 많은 이터레이터는 값을 소비하는 동안 생성하며 전체 항목 수를 저장하지 않습니다. 길이가 정해지지 않은 이런 객체에는 len()를 사용할 수 없습니다. 모든 값을 세어야 하고 이터레이터를 끝까지 소비해도 된다면, 순회하면서 항목을 세세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

generator = (number for number in range(5))
item_count = sum(1 for _ in generator)
print(item_count)

이 방법은 제너레이터의 끝까지 순회하므로, 이후에는 해당 제너레이터에서 값을 다시 가져올 수 없습니다. 나중에 값을 사용해야 한다면 먼저 list(generator)로 리스트에 담은 다음 그 리스트에 len()를 호출하세요. 값을 리스트로 만들면 메모리에 저장됩니다. 따라서 크기가 크거나 끝이 정해지지 않은 스트림에서는 전체 개수를 미리 구하려 하지 말고 데이터에 맞는 방법을 선택하세요.

map()으로 여러 객체의 길이 구하기

길이가 정해진 여러 객체에 len()를 적용하려면, 이를 map()의 함수 인자로 전달하세요. Python 3에서 map()은 이터레이터를 반환합니다. 결과 개수를 한데 모아 확인하고 보관하려면 list()로 감싸세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

objects = [[1, 2, 3], ("a", "b"), "Python"]
lengths = list(map(len, objects))
print(lengths)

결과 리스트에는 입력 객체마다 하나씩, 입력과 같은 순서로 길이가 담깁니다. objects의 모든 객체가 len()를 지원해야 합니다. 그중 길이가 없는 이터레이터가 있으면 요청한 길이를 모두 구할 수 없습니다. 각 개수를 한 번만 처리하면 된다면 리스트를 만들지 않고 map(len, objects)를 바로 순회할 수 있습니다. 전체 개수를 표시하거나 인덱스로 접근하거나 재사용해야 할 때 리스트 형태를 사용하세요.