«TypeError: объект« int »не может быть подписан» - я неправильно использую очередь? - PullRequest
0 голосов
/ 12 января 2019

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

и, как и предполагалось, я перешел к работе с декой BFS, но теперь, когда я пытаюсь ввести подробности ячейки, это работает (я могу напечатать значения, и они верны), но по какой-то причине компилятор все еще говорит me "TypeError: объект 'int' не является подписным". Я посмотрел некоторые другие статьи здесь об этой проблеме, и все они говорили о попытке достичь местоположения внутри int, поскольку это был массив, но это не то, что я делаю, я пытаюсь достичь кортежа. (Я проверил тип ячейки - это кортеж)

Буду благодарен за любую помощь.

    for row in range(len(node.state)):
        for col in range(len(node.state[0])):
            if node.state[row][col] == DEST or node.state[row][col] == PDEST or node.state[row][col] == BDEST:
                visitedCells[row, col] = 0

    queue = collections.deque(visitedCells.items())

    while queue:
        cell, val = queue.pop()

        row = cell[0]
        col = cell[1]

        if ((row + 1, col) not in visitedCells and (node.state[row + 1][col] == EMPTY or node.state[row + 1][col]
                                                    == BOX or node.state[row + 1][col] == PLAYER or
                                                    node.state[row + 1][col] == ICE or node.state[row + 1][col]
                                                    == PICE or node.state[row + 1][col] == BICE)):
            visitedCells[row + 1, col] = val + 1
            queue.append((row + 1, col))

обратная связь:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Users\roniz\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:/Users/roniz/PycharmProjects/AIp1t2/check.py", line 20, in run
    self.result = func(*args, **kwargs)
  File "C:/Users/roniz/PycharmProjects/AIp1t2/check.py", line 64, in <lambda>
    result = check_problem(p, (lambda p: search.best_first_graph_search(p, p.h)), timeout)
  File "C:\Users\roniz\PycharmProjects\AIp1t2\search.py", line 257, in best_first_graph_search
    frontier.append(node)
  File "C:\Users\roniz\PycharmProjects\AIp1t2\utils.py", line 750, in append
    bisect.insort(self.A, (self.f(item), item))
  File "C:\Users\roniz\PycharmProjects\AIp1t2\utils.py", line 361, in memoized_fn
    val = fn(obj, *args)
  File "C:\Users\roniz\PycharmProjects\AIp1t2\ex1.py", line 128, in h
    row = cell[0]
TypeError: 'int' object is not subscriptable

1 Ответ

0 голосов
/ 12 января 2019

Вы начинаете свою очередь с ((row, cell), value) кортежей:

queue = collections.deque(visitedCells.items())

, но затем добавьте только (row, cell) кортежей в очередь при обработке:

queue.append((row + 1, col))

Это означает, что строка

cell, val = queue.pop()

задается только двумя целыми числами, для cell и val. Вам также нужно добавить значение:

queue.append(((row + 1, col), val + 1))

или измените свою очередь, чтобы хранить только (row, col) кортежей и получить значения из словаря visitedCells.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...