2010-01-23 9 views
2

J'essaie de faire un solveur de sudoku 4x4 en Python (je ne suis qu'un débutant!) Et en essayant de définir une fonction pour nettoyer mon code quelque peu, je suis tombé sur un étrange comportement que je ne comprends pas vraiment. Apparemment, il y a une différence entre ceci:Échec de l'abstraction de la variable dans la boucle

sudoku = "0200140000230040" 

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku)) 
for i in range(16): 
    for j in range(4): 
     if sudoku[i] == str(j+1): 
      for k in range(4): 
       if len(sudoku[i/4*4+k]) > 1: 
        sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1)) 
      for k in range(4): 
       if len(sudoku[4*k+i%4]) > 1: 
        sudoku[4*k+i%4] = sudoku[4*k+i%4].translate(None, str(j+1)) 

Et celui-ci:

sudoku = "0200140000230040" 

def sd(l): 
    for k in range(4): 
     if len(sudoku[l]) > 1: 
      sudoku[l] = sudoku[l].translate(None, str(j+1)) 

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku)) 
for i in range(16): 
    for j in range(4): 
     if sudoku[i] == str(j+1): 
      sd(i/4*4+k) 
      sd(4*k+i%4) 

Les expressions étranges sont destinées à vérifier les lignes et les colonnes (boîtes ne sont pas encore terminées). Je suis terriblement désolé de perdre votre temps si ce genre de chose a déjà été demandé, mais essayez d'exécuter les deux extraits de code et d'observer les différents résultats que vous obtenez. Merci d'avance.

(j'ai ce sentiment bizarre que je vais me faire engueuler. Huh.)

+1

Pouvez-vous être plus précis sur ce qu'est le problème? "Ça ne fonctionne pas!" ne nous aide pas à évaluer vos problèmes. Il y a certainement une différence entre les deux - le segment inférieur du code est invalide, par exemple, puisque vous ne définissez pas 'k' à l'intérieur du bloc' if sudoku [i] == '. –

Répondre

2

Il y a une différence ... ils échouent avec deux erreurs différentes!

Le premier me donne cette erreur:

File "test.py", line 9, in <module> 
    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1)) 
TypeError: expected a character buffer object 

Le second me donne cette erreur:

File "test.py", line 12, in <module> 
    sd(i/4*4+k) 
NameError: name 'k' is not defined 

Je pense que le principal problème vous est supposer que l'arbre d'expression pour « i/4 * 4 + k 'sera passé en paramètre à la fonction, mais en fait il est évalué avant que l'appel de la fonction ne soit fait et ceci échoue parce que k n'est pas défini. Vous pouvez utiliser cette place:

sd(lambda k: i/4*4+k) 

et à l'intérieur de la fonction sd vous pouvez remplacer l avec des appels à l (k). Maintenant, vous obtenez la même erreur pour les deux programmes.

+0

Eh bien, cela n'a pas fonctionné de cette façon, mais je viens de remarquer que - en effet - k n'est pas défini, remplaçant ainsi " sd (i/4 * 4 + k) sd (4 * k + i% 4) " avec " pour k dans la plage (4): sd (i/4 * 4 + k) sd (4 * k + i% 4) " et en supprimant le" pour "dans la fonction elle-même fait l'astuce. Merci. – Lynn

+0

Il '.translate (None)' ne fonctionne pas - vous devez utiliser 'string.maketrans ({})' pour produire une table d'identité. Mais '.replace (str (j + 1), '')' est plus simple! –