如何遍历元组字典

时间:2018-11-20 09:58:52

标签: python dictionary tuples

我有一个元组的列表,称为possible_moves,其中包含游戏中棋盘上的可能动作:

[(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 :(得分:2)

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

编辑:事实证明我不太正确。假设动作列表(possible_moves)包含当前可能的动作,并且字典scores包含所有动作的分数,甚至是不可能的分数,您可以发出:

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

...或者不需要分数:

max_move = max(possible_moves, key=scores.get)

答案 1 :(得分:2)

您可以将maxdict.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

答案 2 :(得分:0)

如果d是字典,则d的迭代器将生成密钥。 d.items()生成键值对。所以:

for move, value in moves_values.items():

答案 3 :(得分:0)

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)