Come ottengo un array vuoto di qualsiasi dimensione in Python?


120

Fondamentalmente voglio un equivalente in Python di questo in C:

int a[x];

ma in python dichiaro un array come:

a = []

e il problema è che voglio assegnare slot casuali con valori come:

a[4] = 1

ma non posso farlo con python, poiché l'array è vuoto.

Risposte:


239

Se per "array" intendi effettivamente una lista di Python, puoi usare

a = [0] * 10

o

a = [None] * 10

91
Una cosa a cui devi prestare attenzione a = [obj] * Nè che lo stesso oggetto appare in ogni elemento dell'array. Se si tratta di un oggetto mutabile e modifichi un elemento, verrà cambiato tutto. ... Ma, per questo esempio che utilizza numeri interi (o qualsiasi altro tipo immutabile), non fa differenza. Oppure, se assegni solo agli elementi, non è nemmeno un problema. (Lo menziono perché l'ho fatto esattamente così troppo spesso :))
dappawit

4
Questo mi bit duro sul mio primo progetto Python, @dappawit. Ascolta questo avvertimento.
The Nate

crea lo stesso riferimento per gli oggetti
Amr Alaa

22

Non puoi fare esattamente quello che vuoi in Python (se ti ho letto correttamente). Devi inserire dei valori per ogni elemento della lista (o come l'hai chiamato, array).

Ma prova questo:

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

Per elenchi di altri tipi, utilizzare qualcosa oltre a 0. Noneè spesso anche una buona scelta.


2
Questa risposta rasenta l'errato. range(N)produrrà già una lista se Python <3.0.
Apalala

1
È vero, produrrà un elenco. Se sei preoccupato per l'efficienza, puoi usarlo xrange(N)in Python 2.x. Tuttavia, non sono sicuro di come sia al limite dell'errore. Lo preferisco a = range(N)perché ogni elemento inizia con un ragionevole "default". Immagino sia una questione di opinione.
dappawit

16

Puoi usare numpy:

import numpy as np

Esempio da Empty Array :

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

7

Basta dichiarare l'elenco e aggiungere ogni elemento. Ad esempio:

a = []
a.append('first item')
a.append('second item')

5
Come vorresti quindi 'assegnare slot casuali'
Tdelang

5

inoltre puoi estenderlo con il metodo di estensione dell'elenco.

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

1

Se tu (o altri ricercatori di questa domanda) fossi effettivamente interessato a creare un array contiguo da riempire con numeri interi, considera 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

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
Sebbene questo codice possa risolvere la domanda, inclusa una spiegazione di come e perché questo risolve il problema aiuterebbe davvero a migliorare la qualità del tuo post e probabilmente si tradurrebbe in più voti positivi. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo alla persona che chiede ora. Si prega di modificare la risposta per aggiungere spiegazioni e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Daniil

0

Se in realtà vuoi un array in stile C.

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

Nota che non esiste il concetto di variabile non inizializzata in python. Una variabile è un nome che è associato a un valore, quindi quel valore deve avere qualcosa. Nell'esempio sopra l'array è inizializzato con zeri.

Tuttavia, questo è raro in Python, a meno che non sia effettivamente necessario per cose di basso livello. Nella maggior parte dei casi, è meglio usare un elenco vuoto o un array numpy vuoto, come suggeriscono altre risposte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.