Перечислите индекс вне диапазона, когда он должен быть в диапазоне - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть эта программа, пытающаяся добавить количество пространств сетки вокруг нее определенного значения, и она продолжает выдавать ошибку «IndexError: list out range». Я попытался настроить его так, чтобы он начинался со столбца и строки поздно и заканчивался раньше, чем один столбец и строка, чтобы получить тот же эффект. Ошибка указывает конкретно на [x + 1] [y + 1].

for l in range(loops):
    for x in range(self.width):
        for y in range(self.height):
            neighbors = 0

            if tiles_copy[x-1][y-1] == 1:
                neighbors += 1
            if tiles_copy[x][y-1] == 1:
                neighbors += 1
            if tiles_copy[x+1][y-1] == 1:
                neighbors += 1
            if tiles_copy[x+1][y] == 1:
                neighbors += 1
            if tiles_copy[x+1][y+1] == 1:
                neighbors += 1
            if tiles_copy[x][y+1] == 1:
                neighbors += 1
            if tiles_copy[x-1][y+1] == 1:
                neighbors += 1
            if tiles_copy[x-1][y] == 1:
                neighbors += 1

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Вы должны предотвратить несуществующие индексы, такие как -1 и self.width, self.width + 1 и т. Д. c ...

Я думаю, что проще сделать функцию, которая выполняет проверку для 8 очков вокруг каждой комбинации xy

# =========================================
def count_neighbors(self, x , y):

    if self.width < 3 or self.height < 3:
        return 0

    neighbors = 0
    x_range = []
    y_range = []

    # get only the valid x and y indexes ------------
    if x > 0:
        if x < self.width - 1:
            x_range = range(x - 1, x + 1 + 1)   # x-1, x, x+1
        else:
            x_range = range(x - 1, x + 1)  # x-1, x
    else:
        # x == 0
        x_range = range(x, x + 1 + 1)   # x, x+1

    if y > 0:
        if y < self.width - 1:
            y_range = range(y - 1, y + 1 + 1)  # y-1, y, y+1
        else:
            y_range = range(y - 1, y + 1)    # y-1, y
    else:
        # y == 0
        y_range = range(y, y + 1 + 1)   #  y, y+1


    for x_index in x_range:
        for y_index in y_range:

            if x_range == x and y_index == y:
                # don't compare with itself
                continue

            if tiles_copy[x_index][y_index] == 1:
                neighbors += 1

    return neighbors


# ============================================
neighbors = 0
for l in range(loops):
    for x in range(self.width):
        for y in range(self.height):
            neighbors += count_neighbors(x, y)

Это немного сложно. Вы должны проверить и отладить это самостоятельно.

0 голосов
/ 13 апреля 2020

Не ответ

Можете ли вы изменить начало вашего l oop на

print(self.width, len(tiles_copy))
for x in range(1, self.width):
    print(self.height, len(tiles_copy[x-1]), len(tiles_copy[x]), len(tiles_copy[x+1]))
    for y in range(1, self.height):

len (tile_copy) должно быть равно self.width и 3 значения в l oop должны быть равны self.height. В предположении, некоторые значения меньше.

...