TypeError: unhashable type: 'list' в шахматной программе python - PullRequest
1 голос
/ 15 октября 2019

Я пишу шахматную программу и проверяю код. Мне нужен ключ из словаря ходов противника (который содержит позицию короля), чтобы найти координату фигуры, помещающей ее в чек. Прямо сейчас это дает мне ошибку:

opponentpieceposition=opponentposition.get(piece)
TypeError: unhashable type: 'list'. 

Обратите внимание, что приведенный ниже пример должен напечатать (1,6)

king=(5,1)
opponentmoves={'ksknight': [(8, 3), (5, 2), (6, 3)],
 'ksbishop': [(3, 6), (4, 7), (5, 8), (1, 4), (1, 6), (3, 4), (4, 3), (5, 1), (6, 1)],
 'king': [(6, 1), (5, 2), (4, 1)],
 'queen': [(4, 5), (2, 4), (1, 3), (2, 6), (1, 7), (4, 4)],
 'qsknight': [(3, 3), (1, 3)]}
opponentposition={'ksknight': (1, 3), 
 'ksbishop': (1, 6), 
 'king': (6, 1), 
 'queen': (4, 5), 
 'qsknight': (3, 3)}
if king in [z for v in opponentmoves.values() for z in v]:
    piece=[key for key in opponentmoves if king in opponentmoves[key]]
    opponentpieceposition=opponentposition.get(piece)
    print(opponentpieceposition)

Ответы [ 3 ]

1 голос
/ 15 октября 2019

В вашем фрагменте кода есть список, он не может быть ключом словаря. Пожалуйста, следуйте комментариям в коде, как решить эту проблему:

if king in [z for v in opponentmoves.values() for z in v]:
    piece = [key for key in opponentmoves if king in opponentmoves[key]]
    print(piece)  # Let's show what is piece
    # result is ['ksbishop']
    # so we need 1st element of the list pice
    opponentpieceposition=opponentposition.get(piece[0])  # take the 1st element
    print(opponentpieceposition)

Надеюсь, это помогло решить проблему.

1 голос
/ 15 октября 2019

списки и объекты других изменяемых типов не могут использоваться в качестве ключей в словарях (или элементах в наборах).

Эти контейнеры основаны на вычислении значения хеш-функции, которое является функцией «содержимого» объектаво время вставки. Поэтому, если объект (как могут изменяемые объекты) изменяется после вставки, будут проблемы.

Вместо этого вы можете использовать кортеж, который является неизменной последовательностью.

duplicate

0 голосов
/ 16 октября 2019

Вот что у меня получилось.

if king in [z for v in opponent.moves.values() for z in v]:
                        for key in opponent.moves:
                            opponentpiece=opponent.moves[key]
                            if king in opponentpiece:
                                opponentposition=opponent.position[key]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...