Prova a modificare:
for i in xrange(len(data)):
data[i] = "everything"
Il problema di fondo che stai avendo è che quando si scrive data[i]
, con data
essendo un elenco, le i
deve essere un numero intero, un indice numerico nella lista. Ma nel ciclo
for item in data
item
è la cosa reale che è nella lista, vale a dire una stringa, non l'indice numerico della cosa. xrange
è un iteratore che produce numeri anziché i valori nell'elenco, quindi è possibile utilizzarlo.
Un'alternativa sarebbe
for i, _ in enumerate(data):
data[i] = "everything"
La funzione enumerate
ti dà un iteratore su tuple nella forma (index, item)
, quindi tutto quello che dovete fare è prendere l'indice e dimenticare la voce. Non sono sicuro che in un modo o nell'altro (enumerate
o xrange
) sarà significativamente più veloce o migliore, poiché penso che le liste memorizzino la loro lunghezza in una variabile in modo che possa essere rapidamente accessibile senza contare gli elementi dell'elenco.
Tuttavia, se è necessario il valore della lista vecchia per calcolare il nuovo valore della lista, il modo in cui enumerate
sarà probabilmente un po 'più veloce perché si evita di fare Python cercare l'elemento della lista:
for i, item in enumerate(data):
data[i] = func(item)
Questo tipo di cosa è meglio espresso in comprensione lista, però:
data = [func(item) for item in data]
Quando si esegue questa operazione, Python passare attraverso ogni elemento in data
, applicare la funzione ad essa, e costruire un nuovo elenco dai risultati automaticamente, in modo da y Non devi preoccuparti di inserire il risultato di func(item)
nel posto giusto nell'elenco. Il tuo esempio originale potrebbe in realtà essere espressa come
data = ["everything" for item in data]
Sembra un po 'strano (o soluzione), ma funziona in modo corretto. Non sapevo che gli elementi prioritari (nella lista) devono avere il loro ID. Grazie. –
@sigo: che in realtà non è affatto una soluzione, è il modo corretto e perfettamente normale al 100% di eseguire questo tipo di attività (ma si noti ciò che ho detto sulla comprensione delle liste). –
In questo caso particolare, la comprensione delle liste potrebbe essere sostituita dal più veloce 'data = [" tutto "] * len (dati)'. – EOL