Python: чтение индекса списка из файла вне диапазона

#python #list #python-2.7 #exception #indexing

#python #Список #python-2.7 #исключение #индексирование

Вопрос:

Я использую python 2.5 (я знаю, что это старая версия), и я продолжаю получать очень неприятное исключение «Индекс списка вне диапазона». Я работаю над игрой на основе плиток, и ниже приведен код для создания карты, с которой у меня возникли проблемы:

 #Creates the list
def setMapSize(self):
    l = raw_input('Custom Map length: ')
    h = raw_input('Custom Map height: ')
    if not(l=='')and not(h==''):
        self.length = int(l)
        self.height = int(h)
        self.tileMap = [[i]*self.length for i in xrange(self.height)]
        print self.tileMap

#Load each element of the list from a text file
def loadMap(self,filePath='template.txt'):
    loadPath = raw_input('Load the map: ')
    if loadPath =='':
        self.directory = 'c:/Python25/PYGAME/TileRpg/Maps/'   filePath
        print 'Loading map from ',self.directory
        readFile = open(self.directory,'r')

        for y in xrange(self.height):
            for x in xrange(self.length):
                #reads only 1 byte (1 char)
                print '---Location: ',x,y
                print self.tileMap
                self.tileMap[x][y]=int(readFile.read(1))

        print 'Loaded map:',self.tileMap
        readFile.close()
        print 'Map loadedn'
  

Вот выходные данные и сообщение об ошибке, которые я получаю, пожалуйста, скажите мне, знаете ли вы, что происходит:

 Main began

Map began initialization
Map initialized

Custom Map length: 2
Custom Map height: 5
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
Load the map: 
Loading map from  c:/Python25/PYGAME/TileRpg/Maps/template.txt
---Location:  0 0
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
---Location:  1 0
[[9, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
---Location:  0 1
[[9, 0], [9, 0], [0, 0], [0, 0], [0, 0]]
---Location:  1 1
[[9, 9], [9, 0], [0, 0], [0, 0], [0, 0]]
---Location:  0 2
[[9, 9], [9, 9], [0, 0], [0, 0], [0, 0]]
Traceback (most recent call last):
  File "C:Python25PYGAMETileRpgLevelEditorMain.py", line 7, in <module>
    class Main():
  File "C:Python25PYGAMETileRpgLevelEditorMain.py", line 17, in Main
    tileMap.loadMap()
  File "C:Python25PYGAMETileRpgMap.py", line 48, in loadMap
    self.tileMap[x][y]=int(readFile.read(1))
IndexError: list assignment index out of range
  

Как вы можете видеть, индекс, которому я присваиваю, кажется, существует, но я все еще получаю эту ошибку.

Комментарии:

1. Исключение вызывает не чтение.

2. Я знаю это, мне пришлось поместить это в заголовок, поскольку у кого-то уже был заголовок, который я собирался использовать. Исключение составляет то, что в нем говорится, что индекс находится вне диапазона.

Ответ №1:

Вы поменяли местами высоту и ширину; внешний список имеет длину height , а не внутренний. self.tileMap[0] это список длиной 2, поэтому максимальный индекс, который вы можете использовать для него 1 , не 2 равен.

Замена x и y решит эту проблему:

 for x in xrange(self.height):
    for y in xrange(self.length):
        #reads only 1 byte (1 char)
        print '---Location: ',x,y
        print self.tileMap
        self.tileMap[x][y]=int(readFile.read(1))
  

Здесь вам не нужно использовать индексы, вы можете изменять списки напрямую:

 for row in self.tileMap:
    row[:] = [readFile.read(1) for _ in row]
  

Вы можете читать строку за раз:

 for row in self.tileMap:
    row[:] = map(int, readFile.read(self.length))
  

Комментарии:

1. Однако замена высоты и длины не решает проблему, я все еще получаю сообщение об ошибке.

2.@user3050810: обратите внимание, что x теперь цикл завершен range(self.height) , а не self.length .

3. Спасибо, как только я посмотрел на ваш ответ, я изложил проблему на бумаге и понял свою ошибку.