2010-07-24 9 views
1

Bonjour, J'ai codé une version console de Minesweeper juste pour apprendre quelques bases de Python. Il utilise un système de coordonnées enregistré dans un dictionnaire. Maintenant, j'ai réussi à l'implémenter avec succès mais l'accès ou l'assignation d'une valeur à une clé de coordonnées spécifique en utilisant des variables pour le "x, y" de la coordonnée semble ... maladroit. Il y a deux manières différentes que j'ai trouvées mais elles ne semblent pas très élégantes quand je dois les utiliser si souvent.Python: Accès aux valeurs pour une clé Dict créée à l'aide de variables

for i in range(1, ROWS+1): 
     for j in range(1, COLS+1): 
      mine_field["%i,%i" % (i,j)] = 0 

ou

for i in range(1, ROWS+1): 
     for j in range(1, COLS+1): 
      mine_field[",".join([i, j])] = 0 

Il fonctionne assez bien, mais il ne commence à sembler malpropre lors de l'attribution ou valeurs permutation. Y a-t-il une meilleure façon de faire cela?

Merci d'avance.

Répondre

5

Pourquoi ne pas utiliser simplement un tuple comme la clé?

for i in range(1, ROWS+1): 
    for j in range(1, COLS+1): 
     mine_field[(i, j)] = 0 # you don't even need the parentheses! 

utilisant cette méthode, vous pouvez utiliser les index séparés par des virgules-comme ceci:

d = {(1,2):3} 
print d[1, 2] # will print 3 

Et BTW pourquoi utilisez-vous les indices basés sur un?

+0

Ah oui les tuples sont la solution parfaite pour mon problème. Merci. Et les indices basés sur un seul sont principalement pour l'esthétique lors de l'impression. 1,1 serait la première case de la première colonne essentiellement. –

+0

Je trouve souvent assez pour gérer la transformation + 1/-1 en traitant des entrées/sorties et apprendre en interne à utiliser la méthode Python (C etc) basée sur 0. –

+0

Je seconde cela. Il est plus facile d'utiliser des indices à base zéro et de ne les convertir que lors de l'impression des coordonnées. – AndiDog

1

Si vous faites mine_field une liste de listes, vous pouvez utiliser la syntaxe plus agréable:

mine_field = [[0]*ROWS for i in range(COLS)] 

mine_field[i][j] = 1 
+0

C'est un bon point! Je n'ai pas encore essayé de travailler avec une liste de listes en Python donc je pense que je vais créer une version 2.0 et l'implémenter pour avoir de la pratique. Merci! –