Python 如何迭代元组字典

Python 如何迭代元组字典,python,dictionary,tuples,Python,Dictionary,Tuples,我有一个名为“可能的动作”的元组列表,其中包含游戏中棋盘上可能的动作: [(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 possib

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

[(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

问题出在移动的
部分,value
,因为它创建了两个整数索引,但我希望索引
move
是一个元组。

如果
d
是一个dict,
d
的迭代器生成键
d.items()
生成键值对。因此:

for move, value in moves_values.items():

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
编辑:原来我没有完全正确地理解。假设移动列表(我们称之为
可能的移动
)包含当前可能的移动,并且字典
分数
包含所有移动的分数,即使是不可能的移动,您可以发布:

max_score, max_move = max((scores[move], move) for move in possible_moves)
。。。或者,如果您不需要分数:

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

您可以将
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
。如果您可以保证每个动作都作为一个键包含在您的
分数
字典中,您可以稍微简化:

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

注意语法
[]
\uuuu getitem\uuuuuu
的语法糖:如果找不到钥匙,您将遇到
KeyError

我需要一个可能的移动列表,因为我在玩游戏,我必须返回最佳移动。@Orbit09是的,我的意思是,如果你有如图所示的字典,你不需要它来寻找最佳移动。是的,我明白,我可以用你的黑客在字典中找到最佳移动,但是我仍然需要检查找到的移动是否可行。@Orbit09我想我现在明白了。如果我们有一本完整的分数字典,那就容易多了。编辑后的答案应该适合您,但我无法检查结果,因为您在问题中截断了dict。太好了,它工作得很好,谢谢!如果您想要完整值字典,它来自游戏Reversi:[据我现在理解的问题,没有必要将
0
作为回退值,因为
scores
应该包含棋盘的所有字段。如果没有,可能是
-1
float('-inf'))
将是一个更好的回退值,以防出现零点移动。在任何情况下,与我上次编辑时非常相似->+1
res = max(possible_moves, key=scores.__getitem__)