Se connecter avec
S'enregistrer | Connectez-vous

Python et les listes,

Dernière réponse : dans Programmation

Salut bon voila j'ai un petit problème dont mes nombreux teste prouvent qu'il ne devrait pas exister mais bon il existe bel et bien donc je vien vous demander votre avis.

voici le bou de mon code qui ne marche pas :
Citation :
test = lettre[compteur]
print test


Je ne comprend pas pourtant je fais un

Citation :

print lettre
print compteur


et sa m'affiche les bonne donné que je met en clair après :
Citation :
print a[0]
qui est donc l'équivalent de
Citation :
lettre[compteur]
.

Mais lorsque j'essaye avec les variable il ne me les accepte pas ...

Alors je suis pas sur d'avoir été très clair mais bon, si vous voulez plus de précision ^^
Merci

Autres pages sur : python listes

Lassé par la pub ? Créez un compte

Bien oui, justement c'est ce que je disais le problème n'a pas lieu d'etre pourtant sa ne marche pas !!
Et oui compteur a la valeur 0

Dans une liste on peut mettre des chiffres et des lettres non ?? Et le nom de la liste peut etre composé d'autant de caractère qu'on veut non ?
Expert Programmation

Dons, une liste on peut y mettre tout ce qu'on veut:
  1. >>> [2, "toto", [1,2,3], None]
  2. [2, 'toto', [1, 2, 3], None]


Que signifie exactement ton "ça ne marche pas" ? Tu as une erreur ou ça ne fais pas ce que tu voudrais ?

Tien voici mon script

Citation :
chaine = raw_input()
longueurChaine=len(chaine)
compteur = 0
ChaineCrypte = 999
a = ['a32','rui','atp','b68','nio','xla']
b = ['fla','mor','nfh','edj','cur','qor']
while compteur < longueurChaine:
lettre = chaine[compteur]
crypte = lettre[compteur]
ChaineCrypte = str(ChaineCrypte) + str(crypte)
compteur = compteur + 1
print ChaineCrypte
input()


Dans ce script il y a 2 problème le premier ce situe au niveau de la commande que je t'es mis en rouge, sa ne renvoi pas du tout ce que sa devré renvoyer.

Et le 2eme se situe quelques part dans la boucle ou je sais pas trop car lors du lancement la fenetre se ferme directement sans attendre au "input ()" à la fin que je t'es mis en jaune.

Lors des testes je rentré comme comme valeur à "chaine" (à la première ligne) : abab

Voila tu sais tout ^^

PS : c'est quoi le "None" que tu as mis à la fin de ta liste juste en haut dans ton exemple ??
Expert Programmation

Le problème vient d'ici:
  1. lettre = chaine[compteur]
  2. crypte = lettre[compteur]

apparemment, "chaine" est ce que l'utilisateur tape (une chaine de caractères je suppose).

sur le "lettre = chaine[compteur]", lettre représente 1 caractère. Donc, "lettre" n'est pas un tableau (ou une chaine de 1 caractère).
En fait, "lettre[compteur]" n'a pas de sens.

Si tu veux un chiffrement par permutation (très facilement déchiffrable), tu peux faire un dictionnaire (liste de [lettre, lettre chiffrée]).
exemple (je ne met que le cryptage de a,b et c):
  1. cleDict={'a':'r', 'b':'p', 'c':'o'}

et tu ferais simplement:
  1. crypte=cleDict[lettre]

Par contre si un caractère écrit n'est pas présent dans le dictionnaire, ça retourne une erreur (on peut tester si la lettre est présente dans le dictionnaire en faisant "cleDicthas_key('a')").

Pour ton second problème, pourquoi ne mets-tu pas directement raw_input() au lieu de input() ?

ps: "None" c'est pour indiquer "rien": un objet qui n'existe pas (donc pas vraiment d'intérêt :-D )

Merci Cricky, enfaite mon erreur venait du faite que je ne savais pas que l'on pouvait mettre de caractère dans un dictionnaire je pensais que c'était limité à clé, avec une valeur qui était obligatoirement un chiffre.

Bon j'ai adopté ta méthode, mais j'ai quand meme essayé de faire marcher le mien et j'ai essayé de modifier le code en fonction de tes remarques et sa donne ceci :

Citation :

chaine = raw_input()
longueurChaine=len(chaine)
compteur = 0
ChaineCrypte = 999
aa = ['a32','rui','atp','b68','nio','xla']
ba = ['fla','mor','nfh','edj','cur','qor']
while compteur < longueurChaine:
lettre = chaine[compteur]
crypte = str(lettre) + str('a')[compteur]
ChaineCrypte = str(ChaineCrypte) + str(crypte)
compteur = compteur + 1
print ChaineCrypte
raw_input()


Mais la je ne vois pas trop ou se trouve le problème ...
Avec mes modifications lettre devrait à tout les coup devenir une chaine de 2 caractère le premier étant le caractère qu'a tapper l'utilisateur et le second est un "a".
Expert Programmation

Ok, je viens de comprendre ce que tu veux faire.
"str(lettre)" est équivalent à "lettre"
en fait tu voudrais tranformer un nom de variable en variable (à partir de la chaine " 'ab' " obtenir le tableau mis dans "ab").
Ce n'est pas str() qui fait ça, ça transforme n'importe quel objet en chaine de caractère (toi tu veux l'inverse).

si lettre = 'b' pour la 3ème boucle, tu fais:
  1. crypte = 'b' + 'a'[3]


La seule chose que je vois serait d'utiliser la commande "exec()" qui exécute une commande donnée sous forme de chaine de caractère. Donc, il te suffit de tout transformer en chaine de caractère et de l'exécuter.
  1. exec('crypte = ' + lettre + 'a' + '[compteur]')

dans le même exemple, ça fait:
  1. exec('crypte = ba[compteur]')

qui exécute crypte = ba[compteur]

Et là je pense que tu auras ce que tu veux.

Oui voila c'est sa mais je croyait pas qu'il fallait utiliser une commande spécial mais que avec une variable sa marcherait.

Dailleur je ne connaissais pas l'existence de cette commande (je vien de commencer python il y a 3jour :p  )

Si tu avais un ou 2 liens à m'envoyer pour que j'élargisse la liste des commandes que je connais en python je ne dirais pas non ^^

Merci

PS : Merci beaucoup sa marche avec la commande "exec"

Cricky tu peux m'expliquer un peu l'utilisation de la commande exec() parce que j'essaye de l'ap^pliquer sur une autre ligne mais je n'y arrive pas ...

Quand est ce qu'il fauit mettre des + et des ' ' ??

Merci

Pour info j'essaye de placer la commande exec() sur cette ligne :
Citation :

for crypto in liste:
Expert Programmation

exec() prend 1 seul paramètre qui est une chaine de caractère.
par exemple si tu veux exécuter en mettant tout dans une chaine de caractère:
  1. >>> for i in range(1,10,1):
  2. ... print i
  3. ...


il faut remplacer les retours à la ligne par '\n'.
Donc pour exécuter ça à partir d'une chaine de caractère:
  1. exec('for i in range(1,10,1):\n print i')


pour ton exemple:
  1. exec('for crypto in liste:\n la suite')


si dans la variable toto tu as le nom de la variable de la liste à utiliser, tu as:
  1. toto = 'liste'

il te suffit de concaténer les chaines de caractère (le + permet de faire de collage de chaines
  1. exec('for crypto in ' + 'liste' + ':\n la suite')
  2. exec('for crypto in ' + toto + ':\n la suite')

Bon bon bon est ce que tu vois un problème la dedans :

Citation :

while compteur < LongueurChaineCrypte:
LettreCrypte = ChaineCrypte[compteur:compteur2]
for liste in ListeCrypte:
exec('if LettreCrypte in' + liste + ':\n print liste\n raw_input()')


Parce la moi je commence à déséspérer, j'arrive pas à faire la moindre ligne sans qu'il n'y ai un problème !!

PS : ce que tu vois en rouge c'est sur une ligne dans le script.
Expert Programmation

Le exec ne s'utilise que lorsque le contenu d'une variable est le nom d'une autre variable.
C'était le cas lorsque tu avais les listes aa, ab, tu avais une variable lettre dont la valeur était le nom de la variable aa ou ab.

Dans la ligne en rouge, il faut que liste contienne le nom d'une autre variable que tu veux utiliser.
Si tu veux utiliser directement la variable liste, il faut faire:
  1. exec('if LettreCrypte in liste :\n print liste\n raw_input()')

ce qui revient à faire:
  1. if LettreCrypte in liste :
  2. print liste
  3. raw_input()


En gros, il ne faut jamais utiliser le exec(), sauf dans le cas particulier où tu veux accéder au contenu d'une variable, mais d'une varible dont tu ne connais pas le nom à l'avance.
Expert Programmation

Remplace
  1. exec('if LettreCrypte in' + liste + ':\n print liste\n raw_input()')

par
  1. print 'Variable : ' + liste

Et vérifie que le nom afihé est bien celui d'une variable.

Comme tu es dans une boucle, il se peut que certains éléments ne sont pas corrects
Expert Programmation

Ok, je viens de comprendre: il te manque un espace juste après le "in"
si liste contient 'toto', ta ligne exécute:
  1. if LettreCrypte intoto:
  2. print liste
  3. raw_input()

qui donc incorrect à cause du intoto.

Donc, faut pas hésiter à mettre des espaces:
  1. exec('if LettreCrypte in ' + liste + ' :\n print liste\n raw_input()')
Lassé par la pub ? Créez un compte
Tom's guide dans le monde