Вычисление длины коллекций: списки и массивы в 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) # 3Python пары значений (пары значений в python)
Недостатки: низкая производительность (O(n)), возможны ошибки при изменении списка во время итерации (например, удаление элементов). Ручной счёт не рекомендуется для production-кода.
Как явно вызвать магический метод __len__?
Метод object.__len__() вызывается неявно при len(), но может быть вызван напрямую.
my_list = [1, 2, 3]
print(my_list.__len__()) # 3Python 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)) # 3Get 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 – для анализа многомерных массивов.
Расширенные примеры
Сравнение производительности 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) # 66
Использование 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]) # 4Shape: (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)) # 1010
Пользовательский класс с методом __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__()) # 33 3
Длина объектов bytearray и bytes
b = b'hello'
ba = bytearray(b'world')
print(len(b)) # 5
print(len(ba)) # 55 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()