Come dichiarare un array in Python?


491

Come posso dichiarare un array in Python ?

Non riesco a trovare alcun riferimento agli array nella documentazione.


121
Per qualche ragione insondabile, Python chiama array "elenchi". La scuola di design del linguaggio "tutti-sanno-come-si-chiama-così-stiamo-per-chiamarlo-qualcos'altro". È una scelta del nome particolarmente sbagliata, poiché sembra un elenco collegato anziché un array.
Glenn Maynard,

42
@Glenn Maynard: probabilmente perché in linguaggi simili a C le matrici hanno una lunghezza fissa mentre le liste Python no. È più simile al vettore STL in C ++ o ArrayList in Java.
MAK

128
Si chiama un elenco, perché è un elenco. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Una lista. Un array è "una disposizione di elementi con indirizzi equidistanti nella memoria del computer" (wikipedia).
Lennart Regebro,

35
Nulla del termine "array" universalmente compreso suggerisce una lunghezza fissa o qualcosa del contenuto; questi sono solo limiti della particolare implementazione di array da parte di C. Gli elenchi Python sono equidistanti (puntatori agli oggetti, internamente), altrimenti __getitem__non sarebbe O (1).
Glenn Maynard,

24
@Glenn, da en.wikipedia.org/wiki/Array_data_structure: "gli elementi di una struttura di dati di array devono avere le stesse dimensioni" (vero per gli array di Python, non vero per gli elenchi di Python) e "set di tuple di indice valide e gli indirizzi degli elementi (e quindi la formula di indirizzamento degli elementi) sono di solito fissi mentre l'array è in uso "(non vero in Python per entrambi gli elenchi o gli array).
Alex Martelli,

Risposte:


358
variable = []

Ora variablefa riferimento a un elenco vuoto * .

Naturalmente questo è un incarico, non una dichiarazione. In Python non c'è modo di dire "questa variabile non dovrebbe mai fare riferimento a nient'altro che a un elenco", poiché Python è digitato in modo dinamico.


* Il tipo predefinito di Python incorporato è chiamato un elenco , non un array. È un contenitore ordinato di lunghezza arbitraria che può contenere una raccolta eterogenea di oggetti (i loro tipi non contano e possono essere mescolati liberamente). Questo non deve essere confuso con il arraymodulo , che offre un tipo più vicino al arraytipo C ; i contenuti devono essere omogenei (tutti dello stesso tipo), ma la lunghezza è ancora dinamica.


11
Sarebbe possibile inizializzare il contenuto dell'array, come in JavaScript? (es. come variable = ["Hi", "Hello"];?)
Anderson Green

6
@AndersonGreen Sì.
sepp2k,

3
Come dichiareresti un array multidimensionale, quindi (ad es. Un array 2D?)
Anderson Green

7
@AndersonGreen Come ho detto, non esiste una dichiarazione di variabili in Python. Si potrebbe creare una lista multidimensionale prendendo una lista vuota e mettendo altre liste al suo interno o, se le dimensioni della lista sono noti al write-tempo, si può solo scrivere come un letterale come questo: my_2x2_list = [[a, b], [c, d]]. A seconda di ciò di cui hai bisogno di array multidimensionali, potresti anche prendere in considerazione l'uso numpy, che definisce i tipi di array per array multidimensionali, omogenei, non boxati che possono essere molto più efficienti ove applicabile, quindi sono preferibili per i calcoli numerici.
sepp2k,

1
@IfanIqbal Sì, se contiene almeno un elemento, puoi farlo.
sepp2k,

136

Questo è un argomento sorprendentemente complesso in Python.

Risposta pratica

Le matrici sono rappresentate per classe list(vedi riferimento e non mescolarle con generatori ).

Dai un'occhiata agli esempi di utilizzo:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

Risposta teorica

Python's listè un involucro per un array reale che contiene riferimenti ad elementi. Inoltre, l'array sottostante viene creato con dello spazio aggiuntivo.

Le conseguenze di questo sono:

  • l'accesso casuale è davvero economico ( arr[6653]è uguale a arr[0])
  • append l'operazione è "gratuita" pur con un po 'di spazio in più
  • insert l'operazione è costosa

Dai un'occhiata a questa fantastica tabella delle complessità operative .

Inoltre, vedi questa immagine, dove ho provato a mostrare le differenze più importanti tra array, array di riferimenti ed elenco collegato: array, array ovunque


5
Solo per aggiungere, c'è un modo davvero fantastico per tagliare le matrici in pitone: il [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]risultato sarà[2, 3, 4, 5, 6, 7]
Anton Purin

2
Vedo alcuni voti negativi per questo post di volta in volta. Sarebbe bello se qualcuno potesse postare una parola sul perché. Grazie.
Anton Purin,

2
Da vero MVP. È necessario conoscere l'effettivo disegno scelto dell '"elenco" per prendere ragionevoli decisioni di programmazione. Fondamentalmente è come un 'vettore' in C ++. Grazie!
Necro,

Questa è una vera risposta lunga con qualche grande spiegazione!
Ahmed,

Posso aggiungere la notazione pratica per il confronto, ad esempio: a == b[:2]restituisce True se i primi 2 elementi di b sono uguali ai valori della matrice a
Bruno L.

124

In realtà non dichiari cose, ma è così che crei un array in Python:

from array import array
intarray = array('i')

Per ulteriori informazioni, consultare il modulo array: http://docs.python.org/library/array.html

Ora possibile non vuoi un array, ma un elenco, ma altri hanno già risposto. :)


10
Questa è una specie di risposta divertente, ma in realtà non è una buona risposta a una domanda taggata "principiante". Giusto per chiarire: in Python di solito usi un tipo di dati chiamato a list. Python ha un tipo di dati per scopi speciali chiamato an arrayche è più simile a un array C ed è poco usato.
steveha,

63
No, ma tutti gli altri hanno già utilizzato un elenco. Ho pensato che sarebbe stata una buona risposta sottolineare che ci sono anche array.
Lennart Regebro,

8
oggetti di scena super pazzi per questa risposta. Ho programmato in Python per anni e solo recentemente mi sono reso conto che esisteva un vero oggetto array Python diverso dagli oggetti elenco. Sebbene la struttura dei dati sia molto simile, le matrici limitano il tipo di oggetti che l'array può contenere. Ottima risposta @LennartRegebro!
Josh Brown,

4
Questa dovrebbe essere la risposta giusta Elenco e array sono due cose diverse @LennartRegebro grazie
Mina Gabriel,

C'è un motivo specifico per cui potresti voler usare le matrici invece degli elenchi. In particolare, se si dispone di un array chiamato myarray pieno di numeri, è possibile eseguire operazioni matematiche su di esso e tali operazioni vengono applicate a tutti gli elementi al suo interno. Quindi, se esegui myarray / 3, ogni numero all'interno viene diviso per 3. Se provi a fare la stessa cosa con un elenco, otterrai un errore. Pertanto, le matrici sono più efficienti per grandi set di dati di numeri.
Matteo,

66

Penso che tu volessi dire un elenco con le prime 30 celle già riempite. Così

   f = []

   for i in range(30):
       f.append(0)

Un esempio di dove questo potrebbe essere usato è nella sequenza di Fibonacci. Vedi problema 2 in Project Euler


96
È un modo piuttosto barocco di inizializzare un elenco. Prova f = [0] * 30invece.
John Machin,

Non è uguale a a = range (10) da @slehar anwer? Adoro il pitone, è sintassi ed è Zen.
m3nda,

@ erm3nda no: $ python3 Python 3.4.2 [...] >>> a = range (10) >>> stampa (a) range (0, 10) >>>
arp

37

Questo è come:

my_array = [1, 'rebecca', 'allard', 15]

4
Dal momento che questo non è un array Python ma un elenco Python, non sarebbe meno confuso chiamarlo "my_list"?
Mattis Asp

4
Questo crea un elenco, non un array. Sono diversi e hanno proprietà diverse in Python. In particolare, è possibile eseguire operazioni numeriche su un array, ma non su un elenco.
Matteo

21

Per i calcoli, utilizzare matrici intorpidite in questo modo:

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

questi array intorpiditi possono essere salvati e caricati dal disco (anche compressi) e calcoli complessi con grandi quantità di elementi sono veloci come C.

Molto usato in ambienti scientifici. Vedi qui per di più.


17

Il commento di JohnMachin dovrebbe essere la vera risposta. Tutte le altre risposte sono solo soluzioni alternative secondo me! Così:

array=[0]*element_count

essere d'accordo. salvo attento a chiamare anche la variabile "array", o ottenere l'ira purista. a ciò aggiungerei anche che è possibile creare allo stesso modo "matrici multidimensionali":x=[[0] * 10] * 10
Peter S Magnusson,

17

Un paio di contributi hanno suggerito che le matrici in Python sono rappresentate da liste. Questo non è corretto Python ha un'implementazione indipendente array()nel modulo di libreria standard array " array.array()", quindi non è corretto confondere i due. Gli elenchi sono elenchi in Python, quindi fai attenzione alla nomenclatura utilizzata.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

C'è una differenza molto importante tra list e array.array(). Mentre entrambi questi oggetti sono sequenze ordinate, array.array () è una sequenza ordinata omogenea mentre un elenco è una sequenza non omogenea.


16

Non dichiari nulla in Python. Lo usi e basta. Ti consiglio di iniziare con qualcosa come http://diveintopython.net .


2
Alcune volte è necessario dichiarare il tipo di una variabile: se non la si utilizza prima, una struttura di controllo, non esiste al di fuori della struttura di controllo e quindi si costruirà una nuova variabile. Si presume quindi che la variabile sia un int, che si scontra se la si utilizza come un tipo più complesso.
Più chiaro il

@Clearer sì, l'uso delle funzioni a volte ha bisogno di dichiararlo, e talvolta per giocare ad alcuni globi quando si usano le funzioni e non si vuole scrivere troppi argomenti sulle funzioni.
m3nda,

Non è solo una funzione; una semplice istruzione if potrebbe darti lo stesso problema.
Più chiaro il

1
La programmazione è tutta una questione di dichiarazione, indipendentemente dal linguaggio che usi. La dichiarazione di tipo è una storia completamente diversa
Outside_Box

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Adrian Tompkins il

13

Io normalmente solo fare a = [1,2,3]che in realtà è una list, ma per arraysdare un'occhiata a questo formale definizione


11

Per aggiungere alla risposta di Lennart, un array può essere creato in questo modo:

from array import array
float_array = array("f",values)

dove i valori possono assumere la forma di una tupla, elenco o np.array, ma non array:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

e l'output sarà sempre lo stesso:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

La maggior parte dei metodi per la lista funziona anche con array, quelli comuni sono pop (), extend () e append ().

A giudicare dalle risposte e dai commenti, sembra che la struttura dei dati dell'array non sia così popolare. Mi piace però, allo stesso modo in cui si potrebbe preferire una tupla a una lista.

La struttura dell'array ha regole più rigide rispetto a un elenco o np.array, e questo può ridurre gli errori e rendere più facile il debug, specialmente quando si lavora con dati numerici.

I tentativi di inserire / aggiungere un float a un array int genereranno un TypeError:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Mantenere valori che si intendono essere numeri interi (ad es. Elenco di indici) nella forma di array può quindi impedire un "TypeError: gli indici di elenco devono essere numeri interi, non float", poiché gli array possono essere ripetuti, in modo simile a np.array e lists:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

In modo fastidioso, l'aggiunta di un int a un array float farà sì che l'int diventi un float, senza generare un'eccezione.

np.array mantiene lo stesso tipo di dati anche per le sue voci, ma invece di dare un errore cambierà il suo tipo di dati per adattarlo alle nuove voci (solitamente raddoppiare o str):

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

Questo vale anche durante il compito. Se viene specificato il tipo di dati, np.array, ove possibile, trasformerà le voci in quel tipo di dati:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

o, in sostanza:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

mentre array fornirà semplicemente:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

Per questo motivo, non è una buona idea usare np.array per comandi specifici del tipo. La struttura dell'array è utile qui. list conserva il tipo di dati dei valori.

E per qualcosa che trovo piuttosto fastidioso: il tipo di dati è specificato come primo argomento in array (), ma (di solito) il secondo in np.array (). : |

La relazione con C è indicata qui: Python List vs. Array - quando usare?

Divertiti a esplorare!

Nota: la natura tipizzata e piuttosto rigorosa dell'array tende più verso C piuttosto che su Python e, in base alla progettazione, Python non ha molti vincoli specifici del tipo nelle sue funzioni. La sua impopolarità crea anche un feedback positivo nel lavoro collaborativo e la sua sostituzione comporta principalmente un ulteriore [int (x) per x nel file]. È quindi del tutto fattibile e ragionevole ignorare l'esistenza dell'array. Non dovrebbe ostacolare la maggior parte di noi in alcun modo. : D


8

Cosa ne pensi di questo...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6

6

Python li chiama elenchi . Puoi scrivere un elenco letterale con parentesi quadre e virgole:

>>> [6,28,496,8128]
[6, 28, 496, 8128]


4

Avevo una serie di stringhe e avevo bisogno di una matrice della stessa lunghezza di booleani avviata su True. Questo è quello che ho fatto

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]

Sono qui perché volevo la dichiarazione C: int count[26]={0}; probabilmente c'è un modo migliore, ma questa variante di cui boolssopra ha funzionato più count=[0 for ii in range(26)]tardi, poi l'ho cambiata in quello count=[0]*26che sembra preferibile.
user1683793,

2

È possibile creare elenchi e convertirli in array oppure è possibile creare array utilizzando il modulo numpy. Di seguito sono riportati alcuni esempi per illustrare lo stesso. Numpy semplifica anche il lavoro con array multidimensionali.

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

Puoi anche rimodellare questo array in una matrice 2X2 usando la funzione reshape che accetta input come dimensioni della matrice.

mat = a.reshape(2, 2)
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.