2009-05-15 18 views
23

bu mümkün mü: Ben çalıştığınızdaPython'da bir listeyi/diziyi dizine göre doldurmak?

myList = [] 

myList[12] = 'a' 
myList[22] = 'b' 
myList[32] = 'c' 
myList[42] = 'd' 

, alıyorum:

bir "seyrek listesi" için
# IndexError: list assignment index out of range # 
+0

myList =() ismidir Bir tuple, bir tupledaki nesneleri ekleyemez, çıkaramaz veya bulamazsınız. –

+0

Evet, aslında kodda [] kullandım, buraya karıştım. –

cevap

44

Bir şey (örneğin 0 veya None) ile önceden doldurmak gerekecek:

myList = [None] * 100 # Create list of 100 'None's 
myList[12] = 'a' # etc. 

Alternatif Alex Martelli suggested gibi bir listenin yerine dicti kullanın.

25

Kullanmak olabilecek bir dict yerine:

mylist = {} 
mylist[12] = 'a' 

vb Eğer gerçek bir liste ([], () ile başlamaz!) un-set yuvalarını _some_thing, ör. None, küçük bir yardımcı işlevle veya list alt sınıfıyla. Eğer indeksi bunu yapabilirsiniz önce

+0

Hatayı inceleyerek, aslında bir liste kullanıyor, bir tuple değil. –

+3

muhtemelen sözlük 'mylist' çağırmak için en iyi uygulama olmayacak. – SilentGhost

+0

Teşekkürler. Öğeye doğrusal erişime ihtiyacım var, bu yüzden 1'den n'ye endeksleyeceğim, dolayısıyla sözlük kullanamıyorum. –

2

Listedeki diğer konumları bir şeyle doldurmadan (None veya boş bir dize gibi). Yazdığınız kodu kullanarak listeye bir öğe eklemeye çalışmak, IndexError ile sonuçlanacaktır.

Orada mylist.insert da vardır, ancak bu kodu:

myList.insert(12,'a') 

sadece eklemek istiyorum 'a' (sizin örnek kullanarak 0 olurdu) Listedeki ilk boş konumda.

Yani, dediğim gibi, myList[12] adresinden bir şey eklemeden önce, dizinde 0-11 dizinlerinde bir şeyler olmalı.

+0

Gerçekten de, bir öğenin eklenmesi diğer tüm dizinleri taşıyacağından, list.insert() doğru bir çözüm değildir. – gaborous

2

vaktinden listenin boyutunu bilmiyorsanız, sen ve ardından listeyi uzatın hariç/denemek kullanabilirsiniz hariç:

L = [] 
def add(i, s): 
    try: 
     L[i] = s 
    except IndexError: 
     L.extend([None]*(i-len(L)+1)) 
     L[i] = s 

add(12, 'a') 
add(22, 'b') 

----- Güncelleme - -------------------------------------------
Her tgray'in yorumu: sizin kod bir özel durum atmak olasıdır ise zaman çoğu, sen Listesinin uzunluğu her zaman kontrol edebilir ve İstisnalar kaçınmalıdır:

L = [] 
def add(i, s): 
    size = len(L) 
    if i >= size: 
     L.extend([None]*(i-size+1)) 
     L[i] = s 
+0

Artan dizinlere sahip öğeler ekliyorsa, hız muhtemelen 'try-catch' yerine 'if' ifadesi kullanılarak geliştirilebilir. Bu durumda, her seferinde istisnayı yakalayacaksınız, ki bu her seferinde L'nin uzunluğunu kontrol etmekten daha "pahalı". – tgray

+0

Daha "pahalı" olduğunu belirten bir kaynağınız var mı? Ya da ne kadar? Bu yardımcı olur. –

+0

Benim yorum kaynağının bir bağlantısı: http://paltman.com/2008/jan/18/try-except-performance-in-python-a-simple-test/ – tgray

14

Uzunluğunu geçen bir dizine bir değer atamaya çalışırsanız, listenizi sıfırlarla otomatik olarak genişletecek hızlı bir liste sarmalayıcıdır.

class defaultlist(list): 

    def __setitem__(self, index, value): 
     size = len(self) 
     if index >= size: 
     self.extend(0 for _ in range(size, index + 1)) 

     list.__setitem__(self, index, value) 

Şimdi bunu yapabilirsiniz: case birisi ihtiyacı

>>> a = defaultlist([1,2,3]) 
>>> a[1] = 5 
[1,5,3] 
>>> a[5] = 10 
[1,5,3,0,0,10] 
+0

çok güzel! basit ve zarif, teşekkürler –

1

Sadece içeri, benim sorunu için soluction anladım, ben için gerekli bunlardan bazı faktöriyellerin bir sürü kalk

factorials = {} 

def calcFact(v): 
    try: 
     return factorials[v] 
    except KeyError: 
     factorials[v] = math.factorial(v) 
     return factorials[v] 

testcase: tekrar olabilir, işte benim çözümdür

calcFact(99000) 
calcFact(90900) 
calcFact(90090) 
calcFact(90009) 
calcFact(90009) #repeated 
calcFact(90009) #repeated 

Sonuçlar: 1.011 s

: Yukarıdaki kodu (tekrar değerleri depolamak için bir liste) kullanılarak 1.576 s

:

matematiksel calc tekrarlanması

+0

Bu soruya bir cevap vermemektedir. Bir yazardan eleştiri yapmak veya açıklama istemek için yazılarının altında bir yorum bırakın. – phineas

+0

@phineas cevabımda söylediğim gibi, bu benim çözmem gereken bir şeydi ve bu kod okuyarak fark edebileceğiniz gibi "Bir listeyi/dizilimi dizine göre doldurma" ile ilişkiliydi. Bu soruyu çözmenin bir yolu, ancak farklı bir örnekle. –

İlgili konular