[python] exercice de listes

tarang Messages postés 12 Statut Membre -  
 aureargo -
Hello,

Je suis débutant version alpha en programmation. Je me suis pourtant plongé dans l'aventure avec Python pour mon plaisir personnel. C'est donc de façon autodidacte et probablement maladroite que je débute .
Je lis actuellement le livre "apprendre a programmer avec Python" de G.Swinnen et termine le chapitre des listes.
Voici un petit exercice personnel que je n'arrive pas a résoudre:

soit une liste de caractères CDEFGAB (hé oui, vous devinez ma source d'inspiration)
comment faire afficher une harmonisation d'accords de trois sons a partir de chaque degré (CEG * DFA * EGB ... etc.)
Ma syntaxe doit probablement être fausse car il m'affiche une erreur à la 9e ligne

voici:

# -*- coding:Latin-1 -*-
ch = "CDEFGAB"
lc = len(ch)
i = 0
nch = ""
c1, c2, c3 = 0, 2, 4

while i<lc:
nch = nch + "*" + ch[c1] + ch[c2] + ch[c3]
i = i + 1
c1 = c1 + 1
c2 = c2 + 1
c3 = c3 + 1
print nch

merci d'avançe

11 réponses

  1. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Dans beaucoup de cas, on peut se passer du while et utiliser plutôt le FOR.
    C'est le principe des itérateurs.

    Beaucoup d'objets Python sont des itérateurs (chaînes, fichiers, listes, dictionnaires, etc).
    Cela permet de les parcourir facilement avec FOR sans avoir utiliser et incrémenter une variable d'index (i).
    1
  2. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Qu'est-ce qui cloche dans ma ligne 9?

    Tu essaie d'accéder à un caractère dont l'indice est plus grand que le tableau.

    Exemple:
    ch = "CDEFGAB" 
    print ch[12]


    Traceback (most recent call last):
      File "a.py", line 2, in <module>
        print ch[12]
    IndexError: string index out of range


    "index out of range" veut dire que tu as essayé d'utiliser un index hors des valeurs possible (range).
    (normal puisque ma chaîne ne fait que 7 caractères, je peux donc seulement utiliser les indexes 0,1,2.. jusqu'à 6).

    1
    1. aureargo
       
      dans ton cas, lors du quatrième passage de while:
      i=3, lc=7, c3=7 et ch[7]= "index out of range": indice en dehors de la chaine de 7 éléments [0,1,2,3,4,5,6]
      0
  3. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Note: Met ton code entre deux balises < code> sinon on ne voit pas correctement l'indentation.
    0
  4. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Voici comment je ferais:
    ch = "CDEFGAB" 
    ch2 = ch*2  # (Deux fois la longueur de ch)
    for i in range(len(ch)):
        print ch2[i] + ch2[i+2] + ch2[i+4]


    Ce qui donne:
    CEG
    DFA
    EGB
    FAC
    GBD
    ACE
    BDF
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Mais pour faire plus propre, on devrait plutôt faire:
    ch = "CDEFGAB" 
    lc = len(ch)
    for i in range(lc):
        print ch[i%lc]+ch[(i+2)%lc]+ch[(i+4)%lc]


    (% est l'opération de modulo (reste de la division entière))
    0
  7. tarang Messages postés 12 Statut Membre
     
    merci pour cette réponse rapide et efficace
    ce code est effectivement beaucoup plus court
    je découvre cette commande "for i in range". Est-ce une instruction loop, dans ce cas i s'indente? Bref, j'ai de quoi étudier
    Qu'est-ce qui cloche dans ma ligne 9?
    0
  8. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Est-ce une instruction loop, dans ce cas i s'indente? Bref, j'ai de quoi étudier

    En faisant: for a in b
    L'instruction for va extraire élément par élément tout ce que contient b.
    A chaque étape, il met la valeur dans a.
    A l'intérieur du for, il n'y a plus qu'à faire ce que tu veux avec la valeur a extraite de b.

    Exemple:

    mot = "coucou"
    for lettre in mot:
        print lettre.upper()

    ce qui affiche:
    C
    O
    U
    C
    O
    U


    range(n) va créer une liste [0,1,2,3,4,5...n-1]

    Exemple:
    print range(5)
    [0, 1, 2, 3, 4]


    Donc for i in range(5) est équivalent à for i in [0, 1, 2, 3, 4]

    0
  9. tarang Messages postés 12 Statut Membre
     
    limpide ... merci
    voila qui me donne de quoi avançer
    je pense installer un shell sur mon palm, c'est vraiment gai Python
    A++
    0
  10. tarang Messages postés 12 Statut Membre
     
    programme très amusant, chapeau! On dirait Armand Pierre
    merci pour les liens
    0
  11. annie2215
     
    je suis en G2 info de gestion et je cherhe de exercices sur les listes
    0