2013-12-13 16 views
7

Voglio popolare un array in python in modo che possa usare numeri di identificazione per indicizzare nell'array. Non tutti gli indici saranno presenti nell'array e gli elementi non verranno necessariamente aggiunti all'array in ordine. Il più grande indice possibile non è noto (o almeno preferirei non programmarlo in modo rigido). C'è un modo per far crescere dinamicamente la matrice durante l'assegnazione? cioè io voglio qualcosa di simileAumentare dinamicamente un array python assegnandogli

arr = [] 
for x in xs 
    arr[x.index] = x 

ma questo dà "IndexError: lista degli indici assegnazione fuori portata". Ho provato a utilizzare list.insert() ma non funziona se gli elementi non sono inseriti in ordine, in quanto modifica l'indice degli elementi già presenti nell'array.

C'è un buon modo per farlo in python, o devo accontentarmi di inizializzare l'array "abbastanza grande"?

+0

Quello che chiamate Python [array] (http://docs.python.org/2/library/array.html) è in realtà un [elenco] (http://docs.python.org/ 2/tutorial/datastructures.html # more-on-list) – Junuxx

+0

Vedere la domanda duplicata con una risposta migliore: http://stackoverflow.com/questions/4544630/automatically-growing-lists-in-python –

+0

Vedere la domanda duplicata con un anwer migliore: http://stackoverflow.com/questions/4544630/automatically-growing-lists-in-python –

risposta

7

Hai bisogno di un dictionary

arr = {} 
for x in xs: 
    arr[x.index] = x 

Se tutto quello che si sta per fare è di costruire il dizionario, è possibile utilizzare dictionary comprehension come questo

myDict = {x.index:x for x in xs} 
+1

tengfred: i dizionari potrebbero essere un dataset scarsamente popolato di dimensioni sconosciute.Tuttavia, a differenza di un array (o elenco), il suo contenuto non è ordinato, il che significa che il suo iterare in ordine non è possibile, ma ciò potrebbe non avere importanza se si accede solo tramite 'x.index'. – martineau

+0

Un dizionario sembra funzionare, anche se il mio set di dati è piuttosto denso. D'altra parte, le prestazioni non sono critiche, quindi probabilmente sarà abbastanza buono. – tengfred

0

Basta usare arr.append(x) al fine di aggiungere elementi.

+0

Non ho gli elementi in ordine, e voglio indici specifici per gli articoli, indici che non sono continui, quindi append non funziona. – tengfred

0

perché non provi ad aggiungere l'elenco?

arr = [] 
for x in xs 
    arr.append(x) 

quindi accesso arr come: arr [0], arr [1] e così via ..

+0

Ciao! Penso che il motivo per cui hai messo giù voti su [questo thread] (http://stackoverflow.com/q/20772893/176769) (e non è stato da me) è perché la risposta non ha seguito i requisiti della domanda . Controlla [risposta di Faust] (http://stackoverflow.com/a/20788323/176769) per saperne un po 'di più sul formato corretto. Mi è piaciuto il tuo approccio al problema, per favore aggiusta la tua risposta e non eliminata quando è pronta. In bocca al lupo! – karlphillip

0

array Python possono aumentare in modo dinamico, ma semplicemente assegnando ad un indice non estendere l'array.

Gli array hanno il metodo extend per aggiungere un gruppo di elementi contemporaneamente da una raccolta. Per esempio:

>>> a = [1, 2, 3] 
>>> a.extend([None, None]) 
>>> a 
[1, 2, 3, None, None] 

È possibile emulare auto-estensione assegnazione di matrice in questo modo:

def arr_assign(arr, key, val): 
    try: 
     arr[key] = val 
     return 
    except IndexError: 
     # Do not extend the array for negative indices 
     # That is ridiculously counterintuitive 
     assert key >= 0 
     arr.extend(((key + 1) - len(arr)) * [None]) 
     arr[key] = val 
     return 

Ad esempio:

>>> a = [] 
>>> arr_assign(a, 4, 5) 
>>> a 
[None, None, None, None, 5] 

Come un addendum, linguaggi che hanno l'auto-estendono il comportamento di default (es. Perl, Ruby, PHP, JavaScript, Lua) tende ad essere meno severo di Python e restituirà un magico valore nullo se si accede ad uno slot in un array che non esiste. Ciò significa che possono consentire l'auto-estensione quando si assegna a un indice inesistente senza modificare il comportamento dell'array in nessun altro indice.

E.g. In Ruby a[2] non cambia nonostante il fatto che a sia stato modificato al di sotto di esso.

irb(main):006:0> a = [] 
=> [] 
irb(main):007:0> a[2] 
=> nil 
irb(main):008:0> a[4] = 7 
=> 7 
irb(main):009:0> a 
=> [nil, nil, nil, nil, 7] 
irb(main):010:0> a[2] 
=> nil 
Problemi correlati