J'ai une liste de tuples appelés possible_moves contenant les mouvements possibles sur un plateau dans mon jeu:

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

Ensuite, j'ai un dictionnaire qui attribue une valeur à chaque cellule du plateau de jeu:

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

Je veux parcourir tous les mouvements possibles et trouver le mouvement avec la valeur la plus élevée.

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

Le problème est dans la partie for move, value, car il crée deux index entiers, mais je veux que l'index move soit un tuple.

2
Orbit09 20 nov. 2018 à 12:58

4 réponses

Meilleure réponse

IIUC, vous n'avez même pas besoin de la liste des mouvements possibles. Les mouvements et leurs scores qui vous intéressent sont déjà contenus dans le dictionnaire.

>>> 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: il s'avère que je n'ai pas bien compris. En supposant que la liste des mouvements, appelons-la possible_moves, contient les mouvements possibles en ce moment et que le dictionnaire scores contient les scores de tous les mouvements, même les plus impossibles, vous pouvez émettre:

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

... ou si vous n'avez pas besoin du score:

max_move = max(possible_moves, key=scores.get)
2
timgeb 20 nov. 2018 à 10:40
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
wishmaster 20 nov. 2018 à 10:22

Vous pouvez utiliser max avec 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)

Cela suppose que les déplacements introuvables dans votre dictionnaire ont un score par défaut de 0. Si vous pouvez garantir que chaque mouvement est inclus en tant que clé dans votre dictionnaire scores, vous pouvez simplifier quelque peu:

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

Notez que la syntaxe [] est du sucre syntaxique pour __getitem__: si la clé n'est pas trouvée, vous rencontrerez KeyError.

2
jpp 20 nov. 2018 à 10:41

Si d est un dict, l'itérateur de d génère des clés. d.items() génère des paires clé-valeur. Donc:

for move, value in moves_values.items():
0
Amadan 20 nov. 2018 à 10:03