Как получить в Python пустой массив любого размера?

120

Мне в основном нужен Python-эквивалент этого в C:

int a[x];

но в python я объявляю такой массив:

a = []

и проблема в том, что я хочу назначить случайные слоты со значениями вроде:

a[4] = 1

но я не могу этого сделать с python, поскольку массив пуст.

user299648
источник

Ответы:

240

Если под «массивом» вы на самом деле имеете в виду список Python, вы можете использовать

a = [0] * 10

или

a = [None] * 10
Свен Марнах
источник
91
Одна вещь, на которую вы должны обратить внимание, a = [obj] * N- это то, что один и тот же объект obj появляется в каждом элементе массива. Если это изменяемый объект, и вы измените один элемент, все будет изменено. ... Но для этого примера с использованием целых чисел (или любого другого неизменяемого типа) это не имеет значения. Или, если вы просто присваиваете элементы, это тоже не проблема. (Я упоминаю об этом, потому что я делал именно это слишком часто :))
dappawit
4
Это сильно укусило меня за мой самый первый проект Python, @dappawit. Обратите внимание на это предупреждение.
The Nate,
он создает ту же ссылку для объектов
Амр Алаа
22

Вы не можете делать в Python именно то, что хотите (если я правильно вас прочитал). Вам нужно ввести значения для каждого элемента списка (или, как вы его назвали, массива).

Но попробуйте это:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

Для списков других типов используйте что-то помимо 0. NoneЧасто также хороший выбор.

dappawit
источник
2
Этот ответ граничит с неверным. range(N)уже создаст список, если Python <3.0.
Apalala
1
Правда, будет составлен список. Если вас беспокоит эффективность, вы можете использовать xrange(N)Python 2.x. Однако я не уверен, насколько это граничит с неправильным. Я предпочитаю это, a = range(N)потому что каждый элемент начинается с разумного «значения по умолчанию». Думаю, это вопрос мнения.
dappawit 05
16

Вы можете использовать numpy:

import numpy as np

Пример из пустого массива :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  
DanielTheRocketMan
источник
7

Просто объявите список и добавьте каждый элемент. Например:

a = []
a.append('first item')
a.append('second item')
Lyle
источник
5
Как бы вы тогда «назначили случайные слоты»?
Тделанг
5

также вы можете расширить это с помощью метода расширения списка.

a= []
a.extend([None]*10)
a.extend([None]*20)
Pythoni
источник
1

Если вы (или другие искатели этого вопроса) на самом деле были заинтересованы в создании непрерывного массива для заполнения с целыми числами, рассмотрит ByteArray и memoryivew :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16
сойка
источник
1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])
Акшар Патель
источник
2
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснения и дать указание о том , что применять ограничения и допущения.
Даниил
0

Если вам действительно нужен массив в стиле C

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

Обратите внимание, что в python нет концепции неинициализированной переменной. Переменная - это имя, привязанное к значению, поэтому это значение должно что-то иметь. В приведенном выше примере массив инициализируется нулями.

Однако в python это нечасто, если только вам это не нужно для низкоуровневых вещей. В большинстве случаев вам лучше использовать пустой список или пустой массив numpy, как предлагают другие ответы.

blue_note
источник