Programme faux en python

Programme faux en python - Python - Programmation

Marsh Posté le 21-10-2014 à 18:27:02    

bonjour mes amis !  
j'essaie de programmer quelque chose cependant je n'y arrive pas. le but du jeu consiste à faire une "synthèse" d'une liste comportant plusieurs sous-listes composées de la manière suivante : carte=[[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction'],[nb de pas,'direction']].
pour essayer mes petits "bouts" de programmes déjà réalisés, j'ai utilisé cette liste : carte=[[89,'O'],[34,'S'],[56,'N'],[4,'N'],[8,'E'],[432,'S'],[2,'O'],[9,'E'],[876,'E'],[980,'O']]. et le but c'est de renvoyer à l'utilisateur la liste : carte=[[178,'O'],[406,'S']].  
voilà mon travail, pouvez vous me dire ou sont les erreurs ? Python m'indique qu'il y a un probleme avec le "L[2]=='N'" :  
 
carte=[[89,'O'],[34,'S'],[56,'N'],[4,'N'],[8,'E'],[432,'S'],[2,'O'],[9,'E'],[876,'E'],[980,'O']]
E=0
S=0
O=0
N=0
for i in range(1,len(carte)+1):
    L=carte[i]
    if L[2]=='N':
        N=N+L[1]
    elif L[2]=='S':
        N=N-L[1]
    elif L[2]=='E':
        E=E+L[1]
    elif L[2]=='O':
        E=E-L[1]
print(E)
print(N)

Reply

Marsh Posté le 21-10-2014 à 18:27:02   

Reply

Marsh Posté le 21-10-2014 à 21:14:04    

Je suis pas vraiment certains d'avoir compris ce que tu cherches à faire, mais déjà à vue de nez je vois deux choses qui me dérange :
 

for i in range(1,len(carte)+1):


 
Tu ne commences pas début de la carte et pire tu en débordes de 1 !
 

   if L[2]=='N':  
        N=N+L[1]


 
Là je pense comprendre la raison de l'erreur précédente, il semblerai que tu commences à compter à 1 alors qu'en programmation on commence à compter à 0
 

Code :
  1. for i in range(len(carte)):
  2.     L=carte[i]
  3.     if L[1]=='N':
  4.         N=N+L[0]
  5.     elif L[1]=='S':
  6.         N=N-L[0]
  7.     elif L[1]=='E':
  8.         E=E+L[0]
  9.     elif L[1]=='O':
  10.         E=E-L[0]


 
Mais ta logique n'est pas très bonne non plus car tu vas te retrouver avec 4 variables rien que pour des coordonnées, utilise plutôt un axe X et Y

Code :
  1. X=0
  2. Y=0
  3. print(len(carte))
  4. for i in range(len(carte)):
  5.     L=carte[i]
  6.     if L[1]=='N':
  7.         Y=Y+L[0]
  8.     elif L[1]=='S':
  9.         Y=Y-L[0]
  10.     elif L[1]=='E':
  11.         X=X+L[0]
  12.     elif L[1]=='O':
  13.         X=X-L[0]
  14. print(X)
  15. print(Y)


Message édité par caps lock le 21-10-2014 à 21:28:11
Reply

Marsh Posté le 21-10-2014 à 21:29:28    

Salut,

 

En fait le soucis c'est que l'index d'une liste commence a 0 et non a 1.

 

Du coup tes sous listes n'ont pas d'index 2. (python doit te retourner comme erreur: IndexError: list index out of range, ce qui est assez explicite ;) )

 

Idem sur le range, tu vas commencer avec ton exemple sur la 2eme entrée et avoir une erreur quand il va vouloir accéder a l'index de fin.

 

Enfin si je peux me permettre quelques petites choses:
niveau syntaxe:
- On met des espaces après les ',' et entre les opérateurs numériques
- Au niveau des variables, n'utilises pas les majuscules, elles sont normalement réservé pour les constantes. De plus ca coûte pas plus cher de mettre plus de caractères pour avoir des noms de variables clairs (dans le monde python on y tiens, un peu de lecture sur le sujet http://sametmax.com/bien-nommer-se [...] en-python/ )

 

niveau code:
- En python tu peux faire des boucles for sur des listes, tuples et dicts, ce qui dans ton cas simplifierait énormément la lecture du code.
- Tu as la possibilité d'utiliser le syntaxe += et -=, elle permet d'ajouter une valeur a une variable
 my_var += 1 c'est équivalent a my_var = my_var + 1 (et idem pour le -)
- la déclaration de ta carte, c'est plus judicieux, vu qu'elle ne va pas être modifié dans ton programme, d'utiliser les tuples (c'est en gros des listes mais en readonly et donc plus rapide)

 

Du coup voila ce que ca donnerai ;) (ps: j'ai aussi passé les noms en anglais, une bonne habitude a prendre aussi ;) )

 
Code :
  1. map = ((89, 'O'), (34, 'S'), (56, 'N'), (4, 'N'), (8, 'E'), (432, 'S'),
  2.        (2, 'O'), (9, 'E'), (876, 'E'), (980, 'O'),)
  3. east = 0
  4. north = 0
  5. for (length, direction) in map:
  6.     if direction == 'N':
  7.         north += length
  8.     elif direction == 'S':
  9.         north -= length
  10.     elif direction == 'E':
  11.         east += length
  12.     elif direction == 'O':
  13.         east -= length
  14. print(east)
  15. print(north)
 

Edit: on a répondu en même temps avec caps lock, pour l'histoire du x et y je plussois, c'est plus clair ! ;)


Message édité par rage2000 le 21-10-2014 à 21:32:20
Reply

Marsh Posté le 22-10-2014 à 18:07:29    

ahhhh, j'avais oublié que le premier terme d'une liste commençait à 0, c'est pour ça que ça n'allait pas ! et Python ne m'a pas affiché ce "type" de phrase, mais un simple "syntaxe error" ou quelque chose comme ça !
 
merci beaucoup ! si j'ai d'autres problèmes, je n'hésiterais pas !

Reply

Marsh Posté le 22-10-2014 à 19:00:49    

Autre chose, est ce qu'il est possible d'ordonner une liste (composée de plusieurs listes) sur python. Autrement dit, ma liste serait par exemple :  
[[3, 45], [8, 98], [6, 3], [98, 87], [45, 8]]
et je voudrais qu'elle soit ordonnée en fonction du deuxième terme de chaque sous liste, donc ça me donnerait:  
[[6, 3], [45, 8], [3, 45], [98, 87], [8, 98]]

Reply

Marsh Posté le 22-10-2014 à 22:07:30    

carte = [[3, 45], [8, 98], [6, 3], [98, 87], [45, 8]]
carte.sort(key=lambda x: x[1])
print (carte)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed