Вычисление длины коллекций: списки и массивы в Python

Раздел: Структуры данных -> Коллекции

Основные методы определения длины

В Python для получения числа элементов в списке (list), массиве array.array или многомерном массиве numpy.ndarray используется встроенная функция len(). Она работает за константное время O(1) и применима к любым объектам, реализующим магический метод __len__. Ниже рассмотрены основной и альтернативные подходы с примерами и типичными ошибками.

Как получить количество элементов в списке или массиве самым эффективным способом?

Вызов len(collection) – оптимальное решение. Функция возвращает целое число – длину коллекции.

my_list = [10, 20, 30, 40, 50]
print(len(my_list))  # 5

import array
a = array.array('i', [1, 2, 3])
print(len(a))  # 3

import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(len(arr))  # 2 (первая размерность)

Python set list (set и list в python: различия и использование)

Типичная ошибка: попытка применить len() к генератору или итератору. TypeError: object of type 'generator' has no len(). Решение – предварительно преобразовать в список (но осторожно, если данных много).

Другая распространённая путаница: len() даёт количество элементов, а последний индекс – len-1. Ошибка IndexError при обращении по индексу len.

Как подсчитать элементы вручную, без встроенной функции?

Ручной подсчёт с циклом for полезен для обучения или в средах, где len недоступна (редко).

my_list = [5, 10, 15]
count = 0
for element in my_list:
    count += 1
print(count)  # 3

Python пары значений (пары значений в python)

Недостатки: низкая производительность (O(n)), возможны ошибки при изменении списка во время итерации (например, удаление элементов). Ручной счёт не рекомендуется для production-кода.

Как явно вызвать магический метод __len__?

Метод object.__len__() вызывается неявно при len(), но может быть вызван напрямую.

my_list = [1, 2, 3]
print(my_list.__len__())  # 3

Python object get (метод get для объектов в python)

Прямой вызов __len__ – редкость, обычно используют len(). В пользовательских классах достаточно определить __len__, и len() будет работать корректно.

Как узнать количество элементов в многомерном массиве numpy?

Для numpy-массивов len() возвращает только первый размер (количество строк). Чтобы получить общее число элементов или размеры по всем осям, используют атрибуты shape и size.

import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)   # (2, 3)
print(arr.size)    # 6
print(len(arr))    # 2 (первое измерение)

Python get keys (метод get для словарей в python)

Путаница между len(arr) и arr.size – частая ошибка. len() не даёт полной длины для многомерных массивов. Для одномерных массивов len(arr) и arr.size совпадают.

Как определить длину массива из модуля array?

Для array.array len() работает как обычно.

import array
a = array.array('d', [1.5, 2.7, 3.0])
print(len(a))  # 3

Get index python (метод index в python)

Ошибки могут возникнуть при путанице типа элементов (например, 'i' для целых, 'f' для float). len всё равно считает количество элементов, независимо от типа.

Как узнать длину двусторонней очереди deque?

collections.deque также поддерживает len().

from collections import deque
d = deque([1, 2, 3])
print(len(d))  # 3

Для deque нет особых проблем, len() работает за O(1).

Каждый из рассмотренных методов применяется в зависимости от типа данных и задач: len() – универсальный выбор, ручной счёт – для обучения, shape – для анализа многомерных массивов.

- словарь данных python (словарь данных в python)
- типы данных python кортеж (кортеж (tuple) в python)
- Python типы данных set (множество (set) в python)

Расширенные примеры

Сравнение производительности len() и ручного подсчёта

Пример
import timeit

my_list = list(range(10**6))

def by_len():
    return len(my_list)

def by_loop():
    count = 0
    for _ in my_list:
        count += 1
    return count

print(timeit.timeit(by_len, number=1000))   # ~0.0001 сек
print(timeit.timeit(by_loop, number=1000))  # ~0.5 сек
0.00012
0.52341

Получение общего числа элементов в списке списков

Пример
nested = [[1, 2], [3, 4, 5], [6]]
total = sum(len(sublist) for sublist in nested)
print(total)  # 6
6

Использование shape и size для многомерных массивов numpy

Пример
import numpy as np
arr = np.random.rand(3, 4, 5)
print('Shape:', arr.shape)   # (3, 4, 5)
print('Total size:', arr.size)  # 60
print('First dim:', len(arr))  # 3
print('Second dim:', arr.shape[1])  # 4
Shape: (3, 4, 5)
Total size: 60
First dim: 3
Second dim: 4

Преобразование генератора в список для получения длины

Пример
gen = (x**2 for x in range(10))
# print(len(gen))  # TypeError
gen_list = list(gen)
print(len(gen_list))  # 10
10

Пользовательский класс с методом __len__

Пример
class MyCollection:
    def __init__(self, data):
        self.data = data
    def __len__(self):
        return len(self.data)

m = MyCollection([1, 2, 3])
print(len(m))  # 3
print(m.__len__())  # 3
3
3

Длина объектов bytearray и bytes

Пример
b = b'hello'
ba = bytearray(b'world')
print(len(b))   # 5
print(len(ba))  # 5
5
5

Ошибка при использовании len() на итераторе map

Пример
m = map(str.upper, ['a', 'b', 'c'])
try:
    print(len(m))
except TypeError as e:
    print('Ошибка:', e)  # object of type 'map' has no len()
Ошибка: object of type 'map' has no len()

Длина списка и массива в Python - comments

En
Python длина списка (python)