Вопрос-Ответ

Create an empty list with certain size in Python

Создание пустого списка определенного размера в Python

Как мне создать пустой список, который может содержать 10 элементов?

После этого я хочу присвоить значения в этом списке. Например:

xs = list()
for i in range(0, 9):
xs[i] = i

Однако это дает IndexError: list assignment index out of range. Почему?


Примечание редактора:

В Python списки не имеют заданной емкости, но невозможно назначить элементы, которых еще нет. Ответы здесь показывают код, который создает список с 10 "фиктивными" элементами для замены позже. Однако большинство новичков, сталкивающихся с этой проблемой, на самом деле просто хотят создать список, добавив в него элементы. Это должно быть сделано с помощью .append метода, хотя часто существуют способы создания списка более прямым способом, зависящие от конкретной проблемы. Пожалуйста, прочитайте, Почему этот итеративный код увеличения списка выдает IndexError: list assignment index out of range? Как я могу повторно добавлять элементы в список? подробнее.

Переведено автоматически
Ответ 1

Вы не можете назначить списку значение типа xs[i] = value, если только список уже не инициализирован по крайней мере i+1 элементами (потому что первый индекс равен 0). Вместо этого используйте xs.append(value) для добавления элементов в конец списка. (Хотя вы могли бы использовать обозначение присваивания, если бы использовали словарь вместо списка.)

Создание пустого списка:

>>> xs = [None] * 10
>>> xs
[None, None, None, None, None, None, None, None, None, None]

Присвоение значения существующему элементу приведенного выше списка:

>>> xs[1] = 5
>>> xs
[None, 5, None, None, None, None, None, None, None, None]

Имейте в виду, что что-то вроде xs[15] = 5 все равно не сработает, поскольку в нашем списке всего 10 элементов.

range(x) создает список из [0, 1, 2, ... x-1]

# 2.X only. Use list(range(10)) in 3.X.
>>> xs = range(10)
>>> xs
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Использование функции для создания списка:

>>> def display():
... xs = []
... for i in range(9): # This is just to tell you how to create a list.
... xs.append(i)
... return xs
...
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Понимание списка (используя квадраты, потому что для диапазона вам не нужно всего этого делать, вы можете просто вернуть range(0,9) ):

>>> def display():
... return [x**2 for x in range(9)]
...
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]
Ответ 2

Попробуйте это вместо:

lst = [None] * 10

Вышесказанное создаст список размером 10, где каждая позиция инициализируется значением None. После этого вы можете добавлять в него элементы:

lst = [None] * 10
for i in range(10):
lst[i] = i

По общему признанию, это не питонический способ делать что-либо. Лучше сделайте это:

lst = []
for i in range(10):
lst.append(i)

Или еще проще, в Python 2.x вы можете сделать это, чтобы инициализировать список со значениями от 0 до 9:

lst = range(10)

И в Python 3.x:

lst = list(range(10))
Ответ 3

принятый в настоящее время ответ varunl

 >>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

Хорошо работает для безынерционных типов, таких как numbers. К сожалению, если вы захотите создать список списков, вы столкнетесь с ошибками ссылок. Пример в Python 2.7.6:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>>

Как вы можете видеть, каждый элемент указывает на один и тот же объект списка. Чтобы обойти это, вы можете создать метод, который инициализирует каждую позицию ссылкой на другой объект.

def init_list_of_objects(size):
list_of_objects = list()
for i in range(0,size):
list_of_objects.append( list() ) #different object reference each time
return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>>

Вероятно, существует стандартный, встроенный в python способ сделать это (вместо написания функции), но я не уверен, что это такое. Был бы рад, если бы его исправили!

Редактировать: это [ [] for _ in range(10)]

Пример :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]
Ответ 4

Я удивлен, что никто не предлагает этот простой подход к созданию списка пустых списков. Это старая тема, но я просто добавляю это для полноты картины. Это создаст список из 10 пустых списков

x = [[] for i in range(10)]
python list