Массив на основе range: методы получения списка чисел
Преобразование range в список
Функция range() в Python возвращает неизменяемый объект, поддерживающий итерацию, но не являющийся списком. Для создания массива (списка) чисел необходимо явное преобразование. Основной и наиболее эффективный способ - использование list(range(...)). Рассмотрим этот и альтернативные подходы.
Базовое решение: list(range(...))
Функция list() принимает итерируемый объект и возвращает список. Например, чтобы получить список чисел от 0 до 9:
numbers = list(range(10))
print(numbers)Array range python (массив из range() в python)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
последовательность чисел 2 python (генерация последовательности чисел с шагом 2 в python)
Можно задать начало, конец и шаг: list(range(2, 10, 2)) вернёт четные числа от 2 до 8.
Как создать список с помощью спискового включения?
Списковое включение (list comprehension) позволяет добавить условия или преобразовать значения. Пример:
squares = [x**2 for x in range(1, 6)]
print(squares)[1, 4, 9, 16, 25]
Типичные ошибки:
Забывают указать преобразование типа, если элементы должны быть других типов (например, строки).
Как применить оператор распаковки к range?
Оператор * распаковывает итератор в список: [*range(5)]. Результат аналогичен list(range(5)).
nums = [*range(5)]
print(nums)[0, 1, 2, 3, 4]
Проблемы:
При очень большом диапазоне распаковка может потребовать много памяти, так как все элементы создаются сразу. Для больших последовательностей лучше использовать list() или оставить range как итератор.
Как создать массив фиксированного типа с помощью array?
Модуль array предоставляет массивы для чисел одного типа. Преобразуем range в массив целых чисел:
import array
arr = array.array('i', range(5))
print(arr)array('i', [0, 1, 2, 3, 4])Ошибки:
Необходимо указать код типа (например, 'i' для int). Неподходящий код вызовет ошибку TypeError при попытке добавить значение другого типа.
Как использовать NumPy для создания массива из диапазона?
Библиотека NumPy предлагает numpy.arange для создания массива чисел с плавающей точкой или целых:
import numpy as np
arr = np.arange(0, 10, 2)
print(arr)[0 2 4 6 8]
Проблемы:
NumPy требуется установить отдельно (pip install numpy). Для простых задач это избыточно.
Как преобразовать range в список через цикл for?
Можно вручную собирать список, добавляя каждый элемент из range. Это неэффективно, но иллюстрирует работу цикла:
result = []
for i in range(5):
result.append(i)
print(result)[0, 1, 2, 3, 4]
Ошибки:
Забывают инициализировать пустой список или неправильно задают append. Такой подход медленнее, чем list().
Расширенные примеры работы с range и списками
Преобразование с изменением типа элементов
Используя списковое включение, можно создать список строк из чисел диапазона:
str_numbers = [str(x) for x in range(3, 10, 2)]
print(str_numbers)['3', '5', '7', '9']
Создание вложенных списков с помощью range
Генерация списка списков, где каждый внутренний список содержит фиксированное число элементов:
matrix = [[j for j in range(3)] for i in range(4)]
print(matrix)[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
Использование range для заполнения массива случайными числами
Создание списка случайных целых чисел в заданном диапазоне:
import random
random_nums = [random.randint(1, 100) for _ in range(10)]
print(random_nums)Пример вывода: [34, 87, 12, 56, 99, 42, 78, 23, 67, 5]
Преобразование range в массив double с помощью array
Для чисел с плавающей точкой используется код типа 'd':
import array
float_arr = array.array('d', [x*0.5 for x in range(5)])
print(float_arr)array('d', [0.0, 0.5, 1.0, 1.5, 2.0])Сравнение производительности разных методов
Разница во времени выполнения для большого диапазона (100 000 элементов):
import timeit
n = 100000
# list(range)
time_list = timeit.timeit(lambda: list(range(n)), number=100)
# списковое включение
time_comp = timeit.timeit(lambda: [i for i in range(n)], number=100)
# распаковка
time_unpack = timeit.timeit(lambda: [*range(n)], number=100)
print(f"list(range): {time_list:.3f}s")
print(f"list comprehension: {time_comp:.3f}s")
print(f"unpack: {time_unpack:.3f}s")Пример вывода: list(range): 0.423s list comprehension: 0.512s unpack: 0.441s
Из примера видно, что list(range) обычно быстрее, хотя разница незначительна.
Создание списка индексов для выборки из другого списка
Использование range вместе с индексацией для извлечения элементов:
names = ['Alice', 'Bob', 'Charlie', 'Diana']
indices = list(range(1, 3)) # [1, 2]
selected = [names[i] for i in indices]
print(selected)['Bob', 'Charlie']
Генерация монотонно убывающей последовательности
Отрицательный шаг в range даёт убывающие числа:
desc_list = list(range(10, 0, -2))
print(desc_list)[10, 8, 6, 4, 2]