2010-12-10 21 views
5

Bir dizi/matris değeri istemek için iyi bir yol gerekir, ancak bağıl olmayan dizin için varsayılan (0) değeri bildirilmelidir:
b [2 ] [4], eğer 2 indeks uzunluğu 3,
b [-1] [2] de
ise geri dönmelidir: Getting a default value on index out of range in Python, fakat negatif indeksler için işe yaramayacağını düşünüyorum. piton hep (doğru?) onlara dizi uzunluğu eklemek beri
Ben __getitem__ aşırı yükleme hattı boyunca düşünüyordum, ama sadece 1 ay önce piton geldi ve ben çok yetenekli değilim ...python: dizin dışı değerler için dizi varsayılan değeri

herhangi bir yardım takdir!

alessandro

+0

ve kod çıktınız? Seyrek – pyfunc

cevap

8

Bir süresiz ölçekli seyrek matris istiyorsanız, defautldict kullanabilirsiniz:

py> matrix=defaultdict(lambda:defaultdict(lambda:0)) 
py> matrix[2][4] 
0 
py> matrix[2][4]=8 
py> matrix[2][4] 
8 
py> matrix[-1][2] 
0 
+1

+1 "dizi" == dict. Anahtarlar için tuplelerle sadece tek bir dict (iç içe değil) kullanmanın hayranıyım. matris [2, 4]. –

+0

@Ben: Katılıyorum, iki boyutlu dizilerde daha iyi indeksler yapar. Bununla birlikte, endeksleri ayrı tutmak OP'nin sorusu için bir gereklilikti. –

+0

- Oh, cevabınız üzerinden çörekler toplamadım, bu öneriyi yapmak için doğal bir yer gibi görünüyordu. :-) –

0

Sanırım sorunu karıştırıyorsunuz.

listy[-1] bir göreli endeksi şekildedir, gerçek endeks eşittir len (listy),

listy[-2] gerçek endeks len (listy) -1, ... ve Eğer öyleyse

üzerinde bağıl indeks mevcut değil, yine de IndexError'u yükseltecektir. [][0] veya bu [1][-2]

0

beri piton hep (? True) onlara dizi uzunluğu eklemek

bu gibi

Yerleşik Python dizileri bunu yapar, ancak Python derleyici tarafından değil, bu dizilerin uygulamaları tarafından gerçekleştirildiğini söyleyebilirim. Yani hayır, __getitem__ (veya __getslice__) 'ınızda negatif değerler alırsınız ve bunları istediğiniz gibi halledebilirsiniz. genel bilginin için

0

, GetItem ve setItem kullanımı şudur:

liste sınıfını (class newListClass(list):) geçersiz kılmak ve isterseniz

def __getitem__(self,index): 
    print index 
    return self.mylist[index] 

def __setitem__(self,index,value): 
    self.mylist[index]=value 

(nesne sınıfının içinde) Listenin getitemini kendi getitem'inizde kullanın, aşağıdakileri yazmanız gerekir:

class newListClass(list): 
    def __getitem__(self,index): 
     return list.__getitem__(self,index) 

Bu şekilde getitem'dan istisna da yakalayabilir ve bunun yerine istediğinizi geri alabilirsiniz. , bu sorunun bir cevabı değil, Martin'in ... ama getitem kullanımıyla ilgileniyorsunuz, böylece bunu yapmanın yolu bu. :)

İlgili konular