Массивы
Большинство программ работает не с отдельными переменными, а с набором переменных. Например, программа может обрабатывать информацию об учащихся класса, считывая список учащихся с клавиатуры или из файла, при этом изменение количества учащихся в классе не должно требовать модификации исходного кода программы.
Раньше мы сталкивались с задачей обработки элементов последовательности, например, вычисляя наибольший элемент последовательности. Но при этом мы не сохраняли всю последовательность в памяти компьютера, однако, во многих задачах нужно именно сохранять всю последовательность, например, если бы нам требовалось вывести все элементы последовательности в возрастающем порядке (“отсортировать последовательность”).
Для хранения таких данных можно использовать структуру данных, называемую в Питоне список (в большинстве же языков программирования используется другой термин “массив”). Список представляет собой последовательность элементов, пронумерованных от 0, как символы в строке. Список можно задать перечислением элементов списка в квадратных скобках, например, список можно задать так:
Primes = [2, 3, 5, 7, 11, 13]
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
В списке Primes — 6 элементов, а именно, Primes[0] == 2, Primes[1] == 3, Primes[2] == 5, Primes[3] == 7, Primes[4] == 11, Primes[5] == 13. Список Rainbow состоит из 7 элементов, каждый из которых является строкой.
Также как и символы строки, элементы списка можно индексировать отрицательными числами с конца, например, Primes[-1] == 13, Primes[-6] == 2.
Длину списка, то есть количество элементов в нем, можно узнать при помощи функции len, например, len(A) == 6.
Рассмотрим несколько способов создания и считывания списков. Прежде всего можно создать пустой список (не содержащий элементов, длины 0), в конец списка можно добавлять элементы при помощи метода append. Например, если программа получает на вход количество элементов в списке n, а потом n элементов списка по одному в отдельной строке, то организовать считывание списка можно так:
A = []
for i in range(int(input()):
A.append(int(input())
В этом примере создается пустой список, далее считывается количество элементов в списке, затем по одному считываются элементы списка и добавляются в его конец.
Для списков целиком определены следующие операции: конкатенация списков (добавление одного списка в конец другого) и повторение списков (умножение списка на число). Например:
A = [1, 2, 3]
B = [4, 5]
C = A + B
D = B * 3
В результате список C будет равен [1, 2, 3, 4, 5], а список D будет равен [4, 5, 4, 5, 4, 5]. Это позволяет по-другому организовать процесс считывания списков: сначала считать размер списка и создать список из нужного числа элементов, затем организовать цикл по переменной i начиная с числа 0 и внутри цикла считывается i-й элемент списка:
A = [0] * int(input())
for i in range(len(A)):
A[i] = int(input())
Вывести элементы списка A можно одной инструкцией print(A), при этом будут выведены квадратные скобки вокруг элементов списка и запятые между элементами списка. Такой вывод неудобен, чаще требуется просто вывести все элементы списка в одну строку или по одному элементу в строке. Приведем два примера, также отличающиеся организацией цикла:
for i in range(len(A)):
print(A[i])
Здесь в цикле меняется индекс элемента i, затем выводится элемент списка с индексом i.
for elem in A:
print(elem, end = ' ')
В этом примере элементы списка выводятся в одну строку, разделенные пробелом, при этом в цикле меняется не индекс элемента списка, а само значение переменной (например, в цикле for elem in [‘red’, ‘green’, ‘blue’] переменная elem будет последовательно принимать значения ‘red’, ‘green’, ‘blue’.
Create a List With a Specific Size in Python

- Preallocate Storage for Lists
- Preallocate Storage for Other Sequential Data Structures
Preallocating storage for lists or arrays is a typical pattern among programmers
when they know the number of elements ahead of time.
Unlike C++ and Java, in Python, you have to initialize all of your pre-allocated storage with some values. Usually, developers use false values for that purpose, such as None , » , False , and 0 .
Python offers several ways to create a list of a fixed size, each with
different performance characteristics.
To compare performances of different approaches, we will use Python’s standard
module timeit .
It provides a handy way to measure run times of small chunks of Python code.
Preallocate Storage for Lists
The first and fastest way to use the * operator, which repeats a list a specified
number of times.
>>> [None] * 10 [None, None, None, None, None, None, None, None, None, None]
A million iterations (default value of iterations in timeit ) take approximately
117 ms.
>>> timeit("[None] * 10") 0.11655918900214601
Another approach is to use the range built-in function with a list comprehension.
>>> [None for _ in range(10)] [None, None, None, None, None, None, None, None, None, None]
It’s almost six times slower and takes 612 ms second per million iterations.
>>> timeit("[None for _ in range(10)]") 0.6115895550028654
The third approach is to use a simple for loop together with the list.append() .
>>> a = [] >>> for _ in range(10): . a.append(None) . >>> a [None, None, None, None, None, None, None, None, None, None]
Using loops is the slowest method and takes 842 ms to complete a million iterations.
>>> timeit("for _ in range(10): a.append(None)", setup="a=[]") 0.8420009529945673
Preallocate Storage for Other Sequential Data Structures
Since you’re preallocating storage for a sequential data structure, it may make a lot of sense to use the array built-in data structure instead of a list.
>>> from array import array >>> array('i',(0,)*10) array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
As we see below, this approach is second fastest after [None] * 10 .
>>> timeit("array('i',(0,)*10)", setup="from array import array") 0.4557597979946877
Let’s compare the above pure Python approaches to the NumPy Python package for scientific computing.
>>> from numpy import empty >>> empty(10) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
The NumPy way takes 589 ms per million iterations.
>>> timeit("empty(10)", setup="from numpy import empty") 0.5890094790011062
However, the NumPy way will be much faster for more massive lists.
>>> timeit("[None]*10000") 16.059584009999526 >>> timeit("empty(10000)", setup="from numpy import empty") 1.1065983309963485
The conclusion is that it’s best to stick to [None] * 10 for small lists, but switch
to NumPy’s empty() when dealing with more massive sequential data.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
Related Article — Python List
- Convert a Dictionary to a List in Python
- Remove All the Occurrences of an Element From a List in Python
- Remove Duplicates From List in Python
- Get the Average of a List in Python
- What Is the Difference Between List Methods Append and Extend
- Convert a List to String in Python
Python. Создать список на основе длины другого списка
Как создать другой список, длина которого равна длине списка у и начинаться будет от нуля. Попробовал вот так:
y = [348, 336, 330, 340, 332, 333, 344, 348, 349, 354, 375, 379, 365, 356, 341, 312, 300, 294, 304, 323] x = [] for i in range(len(x)): x[i] = y[i] x.append(x) print(x)
Он выводит мне пустой список
х = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Отслеживать
76.8k 6 6 золотых знаков 55 55 серебряных знаков 123 123 бронзовых знака
задан 12 дек 2017 в 5:45
305 4 4 серебряных знака 15 15 бронзовых знаков
x = list(range(len(y)))
12 дек 2017 в 6:08
у вас в коде две ошибки. первая — for i in range(len(x)): а надо было for i in range(len( y)): вот и выдает вам список длины ноль)) Вторую — сами видите теперь ))
12 дек 2017 в 7:37
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Функция range генерирует последовательность, поэтому тут можно без цикла обойтись:
y = [348, 336, 330, 340, 332, 333, 344, 348, 349, 354, 375, 379, 365, 356, 341, 312, 300, 294, 304, 323] x = list(range(len(y))) print(x)
Вариант с вложенными друг в друга функциями может показаться запутанным, а генератор списка, думаю, будет выглядеть проще:
x = [i for i in range(len(y))]
Мне стало интересно замерить скорость работы алгоритмов заполнения списка.
Вариант с list(range(len(y))) является самым быстрым:
from timeit import timeit y = [348, 336, 330, 340, 332, 333, 344, 348, 349, 354, 375, 379, 365, 356, 341, 312, 300, 294, 304, 323] test_globals = dict(y=y) t = timeit('x = list(range(len(y)))', globals=test_globals) print(f'Elapsed: secs') t = timeit('x = [i for i in range(len(y))]', globals=test_globals) print(f'Elapsed: secs') t = timeit(''' x = [] for i in range(len(y)): x.append(i) ''', globals=test_globals) print(f'Elapsed: secs') t = timeit(''' x = list() for i in range(len(y)): x.append(i) ''', globals=test_globals) print(f'Elapsed: secs')
Elapsed: 0.546 secs Elapsed: 0.875 secs Elapsed: 1.415 secs Elapsed: 1.515 secs
Создание пустых списков определенного размера в Python
Во время изучения Python, особенно для новичков, возникает масса вопросов. Один из наиболее распространенных — как создать пустой список определенного размера.
Представим типичную ситуацию: есть необходимость создать список, который может вместить 10 элементов. Затем в этот список планируется добавить значения.
xs = list() for i in range(10): xs[i] = i
Такой код вызовет ошибку IndexError: list assignment index out of range . Почему же это происходит?
Дело в том, что в Python списки не имеют фиксированной вместимости. Нельзя присвоить значение элементу, который еще не существует в списке. В приведенном выше примере список xs изначально пуст, и при попытке присвоить значение первому элементу (с индексом 0) возникает ошибка, так как такого элемента просто нет.
Для решения этой проблемы есть несколько способов.
Использование метода append()
Один из простейших способов добавления элементов в список — использование метода append() . Этот метод добавляет элемент в конец списка.
xs = list() for i in range(10): xs.append(i)
В этом случае список xs постепенно заполняется значениями от 0 до 9.
Создание списка с «заглушками»
Еще один способ — создать список с «заглушками», которые затем будут заменены на нужные значения.
xs = [None]*10 for i in range(10): xs[i] = i
В этом случае сначала создается список размером 10, все элементы которого равны None . Затем в цикле эти «заглушки» заменяются на нужные значения.
Важно помнить, что Python — гибкий язык, и зачастую есть множество способов решить одну и ту же задачу. Выбор конкретного метода зависит от конкретной ситуации и предпочтений программиста.