首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法计算出此错误-> IndexError:列表索引超出范围

无法计算出此错误-> IndexError:列表索引超出范围
EN

Stack Overflow用户
提问于 2022-11-01 19:32:46
回答 1查看 41关注 0票数 -1

所以我已经研究了这段代码一段时间了,我找不到解决这个问题的方法,我想知道这里有没有人能帮我解决这个问题?这个问题应该出现在"hent_celle“方法中,在该方法中,它从网格中获取一个坐标并返回位于该位置的对象。

错误是:

代码语言:javascript
复制
Traceback (most recent call last): 
File "/Users/cc/Documents/Python/Oblig8/rutenettto.py", line 105, in <module> 
    print(testobjekt._sett_naboer(2,1)) 
File "/Users/cc/Documents/Python/Oblig8/rutenettto.py", line 64, in 
    _sett_naboer nabo_u_kol = self.hent_celle(rad+1,kol) 
File "/Users/cc/Documents/Python/Oblig8/rutenettto.py", line 43, in hent_celle 
    return self._rutenett[rad][kol] IndexError: list index out of range 

守则是:

代码语言:javascript
复制
from random import randint 
from celle import Celle

class Rutenett: 
def init(self,rader,kolonner): 
    self._ant_rader = int(rader) 
    self._ant_kolonner = int(kolonner) self._rutenett = []

def _lag_tom_rad(self):
    liste = []
    for x in range(self._ant_kolonner):
        liste.append(None)
    return liste

def _lag_tomt_rutenett(self):
    liste2 = []
    for x in range(self._ant_rader):
        liste_ = self._lag_tom_rad()
        liste2.append(liste_)
    self._rutenett = liste2

def lag_celle(self,rad,kol):
    celle = Celle()
    tilfeldig_tall = randint(0,100)
    if tilfeldig_tall <= 33:
        celle.sett_levende()
        return celle
    else:
        return celle

def fyll_med_tilfeldige_celler(self):
    for x in self._rutenett:
        for y in x:
            rad = int(self._rutenett.index(x))
            kol = int(x.index(y))
            self._rutenett[rad][kol] = self.lag_celle(rad,kol)

def hent_celle(self,rad,kol):
    if rad > self._ant_rader or kol > self._ant_kolonner or rad < 0 or kol < 0:
        return None
    else:
        return self._rutenett[rad][kol]

def tegn_rutenett(self):
    for x in self._rutenett:
        for y in x:
            print(y.hent_status_tegn(), end="")


def hent_alle_celler(self):
    liste = []
    for x in self._rutenett:
        for y in x:
            liste.append(y)
    return liste

def _sett_naboer(self,rad,kol):
    cellen = self.hent_celle(rad,kol)
    # lik linje
    nabo_v_rad = self.hent_celle(rad,kol-1)
    nabo_h_rad = self.hent_celle(rad,kol+1)
    # under
    nabo_u_kol = self.hent_celle(rad+1,kol)
    nabo_u_kol_h = self.hent_celle(rad+1,kol+1)
    nabo_u_kol_v = self.hent_celle(rad+1,kol-1)
    # over
    nabo_o_kol = self.hent_celle(rad-1,kol)
    nabo_o_kol_h = self.hent_celle(rad-1,kol+1)
    nabo_o_kol_v = self.hent_celle(rad-1,kol-1)

    liste = [nabo_v_rad,nabo_h_rad,nabo_u_kol_h,nabo_u_kol_v,nabo_o_kol,nabo_o_kol_h,nabo_o_kol_v]
    #print(liste)
    #print(nabo_o_kol_h)
    
    for x in liste:
        if x == None:
            pass
        else:
            cellen._naboer.append(x)
    return cellen._naboer
    

def antall_levende(self):
    teller = 0
    for x in self._rutenett:
        for y in x:
            if y._status == "doed":
                pass
            else:
                teller +=1
    return teller

testobjekt = Rutenett(3,3) 
testobjekt._lag_tomt_rutenett() 
testobjekt.fyll_med_tilfeldige_celler() 
print(testobjekt._sett_naboer(2,1))

我只是不明白为什么列表索引超出了范围

EN

回答 1

Stack Overflow用户

发布于 2022-11-01 19:39:44

Pyhton索引从0开始,这意味着一个包含10个元素的列表将使用索引0-9。假设self._ant_raderself._ant_kolonner是行和列的数目,那么radkol需要小于这些值,并且不能是相同的值,否则就会得到超出界限的索引。

该方法的固定版本:

代码语言:javascript
复制
def hent_celle(self,rad,kol):
    if rad >= self._ant_rader or kol >= self._ant_kolonner or rad < 0 or kol < 0:
        return None
    else:
        return self._rutenett[rad][kol]

正如您所看到的,>已经被>=取代了。这意味着超出界限的索引将返回None

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74280953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档