Como faço para obter uma matriz vazia de qualquer tamanho em python?

120

Basicamente, quero um python equivalente a isso em C:

int a[x];

mas em python eu declaro uma matriz como:

a = []

e o problema é que quero atribuir slots aleatórios com valores como:

a[4] = 1

mas não posso fazer isso com python, pois o array está vazio.

user299648
fonte

Respostas:

239

Se por "array" você realmente quer dizer uma lista Python, você pode usar

a = [0] * 10

ou

a = [None] * 10
Sven Marnach
fonte
91
Uma coisa que você deve observar a = [obj] * Né que o mesmo obj aparece em cada elemento do array. Se for um objeto mutável e você modificar um item, todos serão alterados. ... Mas, para este exemplo usando números inteiros (ou qualquer outro tipo imutável), não faz diferença. Ou, se você apenas atribuir a elementos, também não é um problema. (Menciono isso porque tenho feito exatamente isso com muita frequência :))
dappawit
4
Isso me mordeu duro no meu primeiro projeto Python, @dappawit. Preste atenção a este aviso.
The Nate
ele cria a mesma referência para objetos
Amr Alaa
22

Você não pode fazer exatamente o que deseja em Python (se eu li você corretamente). Você precisa colocar valores para cada elemento da lista (ou, como você o chamou, array).

Mas, tente isto:

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

Para listas de outros tipos, use algo além de 0. Nonegeralmente também é uma boa escolha.

dappawit
fonte
2
Esta resposta beira o incorreto. range(N)já irá produzir uma lista se Python <3.0.
Apalala,
1
É verdade que produzirá uma lista. Se você está preocupado com a eficiência, pode usar xrange(N)no Python 2.x. Não tenho certeza de como isso está beirando o incorreto, no entanto. Eu prefiro a = range(N)porque cada elemento começa em um "padrão" sensato. Acho que é uma questão de opinião.
dappawit
16

Você pode usar numpy:

import numpy as np

Exemplo de matriz vazia :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  
DanielTheRocketMan
fonte
7

Apenas declare a lista e acrescente cada elemento. Por ex:

a = []
a.append('first item')
a.append('second item')
Lyle
fonte
5
Como você então 'atribuiria slots aleatórios'
Tdelang,
5

também você pode estender isso com o método extend da lista.

a= []
a.extend([None]*10)
a.extend([None]*20)
Pythoni
fonte
1

Se você (ou outros pesquisadores desta questão) estiverem realmente interessados ​​em criar uma matriz contígua para preencher com inteiros, considere bytearray e 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
Jay
fonte
1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])
Akshar Patel
fonte
2
Embora este código possa resolver a questão, incluir uma explicação de como e por que isso resolve o problema realmente ajudaria a melhorar a qualidade de sua postagem e provavelmente resultaria em mais votos positivos. Lembre-se de que você está respondendo à pergunta para os leitores no futuro, não apenas para a pessoa que está perguntando agora. Por favor edite sua resposta para adicionar explicações e dar uma indicação do que limitações e premissas se aplicam.
Daniil
0

Se você realmente quer uma matriz de estilo C

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

Observe que não há conceito de variável não inicializada em python. Uma variável é um nome que está vinculado a um valor, então esse valor deve ter algo. No exemplo acima, a matriz é inicializada com zeros.

No entanto, isso é incomum em python, a menos que você realmente precise dele para coisas de baixo nível. Na maioria dos casos, é melhor usar uma lista vazia ou array numpy vazio, como outras respostas sugerem.

nota azul
fonte