Как перебрать словарь кортежей - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть список кортежей с именем возможных_ перемещений, содержащих возможные ходы на доске в моей игре:

[(2, 1), (2, 2), (2, 3), (3, 1), (4, 5), (5, 2), (5, 3), (6, 0), (6, 2), (7, 1)]

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

{(0,0): 10000, (0,1): -3000, (0,2): 1000, (0,3): 800, etc.}

Я хочу перебрать все возможные ходы и найти ход с наибольшим значением.

my_value = 0
possible_moves = dict(possible_moves)
for move, value in moves_values:
    if move in possible_moves and possible_moves[move] > my_value:
        my_move = possible_moves[move]
        my_value = value
return my_move

Проблема в части for move, value, поскольку она создает два целочисленных индекса,но я хочу, чтобы индекс move был кортежем.

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

Вы можете использовать max с dict.get:

possible_moves = [(2, 1), (2, 2), (2, 3), (3, 1), (4, 5), (5, 2),
                  (5, 3), (6, 0), (6, 2), (7, 1), (0, 2), (0, 1)]

scores = {(0,0): 10000, (0,1): -3000, (0,2): 1000, (0,3): 800}

res = max(possible_moves, key=lambda x: scores.get(x, 0))  # (0, 2)

Это предполагает, что шаги, не найденные в вашем словаре, имеют оценку по умолчанию 0.Если вы можете гарантировать, что каждое движение включено в качестве ключа в ваш scores словарь, вы можете несколько упростить:

res = max(possible_moves, key=scores.__getitem__)

Обратите внимание, что синтаксис [] является синтаксическим сахаром для __getitem__: если ключне найдено, вы встретите KeyError.

0 голосов
/ 20 ноября 2018

IIUC, вам даже не нужен список возможных ходов.Ходы и их оценки, которые вас интересуют, уже содержатся в словаре.

>>> from operator import itemgetter
>>>
>>> scores = {(0,0): 10000, (0,1): -3000, (0,2): 1000, (0,3): 800}
>>> max_move, max_score = max(scores.items(), key=itemgetter(1))
>>>
>>> max_move
(0, 0)
>>> max_score
10000

edit: оказывается, я не совсем правильно понял.Предполагая, что список ходов, назовем его possible_moves, содержит возможные ходы прямо сейчас, а словарь scores содержит оценки за все ходы, даже невозможные, вы можете выдать:

max_score, max_move = max((scores[move], move) for move in possible_moves)

... или если вам не нужен счет:

max_move = max(possible_moves, key=scores.get)
0 голосов
/ 20 ноября 2018
possibleMoves=[(2, 1), (2, 2), (2, 3), (3, 1), (4, 5), (5, 2),(0, 3),(5, 3), (6, 0), (6, 2), (7, 1),(0,2)]
movevalues={(0,0): 10000, (0,1): -3000, (0,2): 1000, (0,3): 800}
def func():
    my_value=0
    for i in range(len(possibleMoves)):
        for k,v in movevalues.items():
            if possibleMoves[i]==k and v>my_value:


                my_value=v
    return my_value
maxValue=func()
print(maxValue)
0 голосов
/ 20 ноября 2018

Если d является диктом, итератор d генерирует ключи.d.items() генерирует пары ключ-значение.Итак:

for move, value in moves_values.items():
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...