yerine bu deneyin:
for i in xrange(len(data)):
data[i] = "everything"
Yaşadığınız temel sorun data
bir liste olmak üzere data[i]
yazarken, i
ihtiyaçlar bir tamsayı, listeye bir sayısal endeks olmak olmasıdır. Ama döngüde
for item in data
item
listesinde bulunuyor fiili şey, yani bir dize değil, bir şey sayısal endeksidir. xrange
, listedeki değerler yerine sayı üreten bir yineleyicidir, böylece bunu kullanabilirsiniz.
Alternatif böylece tüm yapmanız gereken endeksi alıp öğe hakkında unutmak, enumerate
fonksiyon size formun (index, item)
ait küpe üzerinde bir yineleyici verir
for i, _ in enumerate(data):
data[i] = "everything"
olurdu. Ben bir yol veya diğer (enumerate
veya xrange
) önemli ölçüde daha hızlı ya da daha iyi olacağından emin değilim, çünkü liste bir değişken içinde bir uzunluğunu saklamak, böylece liste elemanları saymadan hızlı bir şekilde erişilebildiğini düşünüyorum.
for i, item in enumerate(data):
data[i] = func(item)
Bu tür: Yeni liste değerini hesaplamak için eski liste değeri gerekirse Python listesinde eleman aramak yapmamak çünkü
Ancak, enumerate
yolu muhtemelen biraz daha hızlı olacak bunu yaptığınızda
data = [func(item) for item in data]
, Python yüzden, data
her öğe geçmesi buna fonksiyonunu uygulamak ve otomatik sonuçlarından yeni bir liste oluşturmak olacaktır: şeyin daha iyi olsa liste anlama, olarak ifade edilir y func(item)
sonucunu listeye doğru yere koyma konusunda endişelenmenize gerek yok. Asıl örneğiniz aslında
Biraz garip (veya geçici çözümü) görünüyor, ama düzgün çalışır. Ben geçersiz öğeler (liste) kimliğine verilmelidir bilmiyordum. Teşekkürler. –
@sigo: bu aslında bir çözüm değil, bu tür bir görev yapmak için% 100 doğru ve çok normal bir yoldur (ancak liste kavramaları hakkında söylediğime dikkat edin). –
Bu özel durumda, liste kavraması daha hızlı "data = [" everything "] * len (data)' ile değiştirilebilir. – EOL