2015-02-09 118 views
0

我想在python中創建自己的Hash數據結構。在__init__我初始化一個大小爲m的列表(m_list),並在另一個函數中從我的散列函數中爲它添加散列。列表索引超出範圍

我現在試圖通過列表進行搜索,尋找價值k。我在if self.m_list[i] == k:行上得到了一個超出範圍錯誤的列表索引。

class Hash: 
    def __init__ (self, n, m, m_list=None): 
     self.n = n 
     self.m = m 
     self.a = choice(range(1, n)) 
     self.b = choice(range(n)) 

     if m_list is None: 
      m_list = [] 
     self.m_list = m_list * m 

    def search(self, k): 
     found = False 
     for i in self.m_list: 
      if i is not None and found is False: 
       if self.m_list[i] == k: 
        found = True 
     if found: 
      print True 
     else: 
      print False 

我創建m_list使用指南從Create an empty list in python with certain size

回答

2

有多種問題與此代碼:索引有自己的內容列表

1)。

for i in self.m_list: 

,當您使用此語法在Python列表循環,在變量(i)值列表的,而不是該次迭代的索引。

有兩種方法可以解決這個問題。如果你因爲某些原因需要有索引,可以循環使用range功能在他們創建的索引和循環,像這樣:

for i in range(len(self.m_list)): 
    if not found and self.m_list[i] == k: 
     found = True 

或者你也可以使用Python的原生遍歷所有內容清單:

for item in self.m_list: 
    if not found and item == k: 
     found = True 

另一種選擇,如果想方便地訪問索引和值都爲使用enumerate。包含值的指數和本身的價值,所以你可以使用Python的多任務enumerate返回元組都可以訪問兩個:

for i, val in enumerate(self.m_list): 
    if val == k: 
     ... 
    if i == some_index 
     ... 

原始代碼將永遠只能當m_list[i] == i == k返回true,因此,如果您縮進要檢查這個條件是否成立,你可以檢查m_list[k] == k

2)正如彼得的回答所指出的,[] * m總是給出[],所以無論提供的索引是什麼,列表的長度都爲零,因此任何索引都將超出範圍。要獲得長度爲m的列表,您需要在列表中有一個元素進行復制。您可以使用None0作爲該值:[0] * m給出了一個m零的列表,而[None] * m給出了一個沒有值的列表m

+0

我會使用'enumerate'搜索方法的版本,你需要索引的東西 - '爲我,val在枚舉(self.m_list):' – 2015-02-09 22:13:31

1

沒有創建大小m的列表。 [] * m爲您提供了[],正如您在交互式shell中所看到的那樣。鏈接的答案顯示如何乘以列表將淺拷貝列表m次的內容,但當然[]沒有要拷貝的內容。嘗試if m_list is None: m_list = [None] * m或類似的東西。

您的搜索方法對我沒有意義(有更好的方法來存儲整數的存在),但這是一個單獨的問題。