Fonction ne fonctionne pas dans la boucle for

Hempates -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis débutant en python et je n'arrive pas à comprendre comment je pourrai parvenir à faire fonctionner une partie de mon petit programme :

def findoccurence(fcx, fclistetotal):
 fcplace = []
 for n in range(len(fclistetotal)):
  if fclistetotal[n] == fcx:
   fcplace.append(n)
 return fcplace
 
car = [
  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
  's','t', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1','2', '3', '4', '5', '6', '7', '8', '9',
  ' ',',', '.', ';', ':', '-', '_', '!', '?', '@', '#', '(', ')'
]
listetotal = list(code1)
for x in car:
 print(findoccurence(x, listetotal))
 if int(len(findoccurence(x, listetotal))) <= 1:
  print("test")
 elif int(len(findoccurence(x, listetotal))) > 1:
  place = findoccurence(x, listetotal)
  print(place)
  del place[0]
  for e in place:
   listetotal[e] = max1[0]
   del max1[0]
print(listetotal)


Quand je lance le programme, code1 étant "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" cela me donne ça:

[]
test
[]
test
[]
.....
test
[]
test
[]
test
[]
test
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']


À chaque fois que la variable "place" est imprimée, elle est vide alors qu'elle ne le devrait pas. J'ai essayé ma fonction:
findoccurence
, dans un programme à part en dehors d'une boucle
for
, et là tout marche correctement.
Dès que je mets ma fonction dans ma boucle
for
comme dans le programme ci-dessus, la fonction que j’ai créée ne fonctionne apparemment plus car
place
est vide alors qu'il devrait y avoir toutes les occurrences de la lettre "a" présente dans la liste
listetotal
.

Pourriez-vous m'expliquer ce que j'ai fait de faux s'il vous plaît. Ou alors me donner une alternative pour faire la même chose.

Merci d'avance

2 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Au début de ton code, on voit:

    listetotal = list(code1)


    mais code1 est initialisée où ?

    Sinon:

    L'indentation étant importante en Python, merci de copier/coller ici ton code complet avec les balises de code
    mode d'emploi:
    https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

    def test():
        print('test')
    
    test()
    
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    @Phil :
    code1 
    est spécifié dans l'énoncé, pas dans le code ;

    Plusieurs remarques en vrac :
    • Donne-nous un code minimal, qui se lance et qui reproduit le problème ;
    • Je te recommande d'utiliser des indentations de taille 2 ou 4 (tu peux configurer ton éditeur pour que lorsque tu appuies sur la touche tabulation, cela engendre un nombre donné d'espaces) ; généralement on prend 4 espaces ;
    • Merci d'expliquer brièvement le but de ton programme, et en particulier le résultat attendu ;
    • Nomme tes variables de manière plus explicites ; en particulier je te recommande de noter au pluriel les listes (genre
      characters 
      au lieu de
      car
      ), cela rend le code plus lisible (et permet par la suite d'écrire des choses du genre
      for element in elements
      )
    • En PEP8 tes variables devrait avoir un nom du genre
      ma_variable 
      au lieu de
      mavariable
      ; idem pour les fonctions ;
    • Inutile de transformer le résultat de
      len()
      en
      int
      : c'est déjà une valeur entière ;
    • Il est plus naturel d'itérer sans utiliser d'indice, ainsi ta fonction devient :


    def findoccurence(fcx, fclistetotal):
      fcplace = []
      for c in fclistetotal):
        if c == fcx:
          fcplace.append(n)
      return fcplace


    ... ou avec une liste compréhension :

    def findoccurence(fcx, fclistetotal):
     return [c for c in fclistetotal) if c == fcx]
    • Ton test
      if int(len(findoccurence(x, listetotal))) <= 1:
      vérifie si le résultat de
      findoccurence(x, listetotal)
      est une liste vide ce qui s'écrit plus simplement :


    if not findoccurence(x, listetotal):
    • le test dans le
      elif 
      est inutile (et relance le calcul pour rien), un simple
      else
      suffit. En fait il faudrait plutôt écrire :


    place = findoccurence(x, listetotal)

    if not place:
      print("test")
    else:
      ...
    • Pas besoin de créer une liste pour lister les caractères intéressants. Une chaîne est au même titre qu'une liste un itérable indexé. Donc tu peux directement utiliser une chaîne dans laquelle sont concaténés tous les caractères. Note que ce que tu veux est sans doute simplement
      string.printable
      :


    import string
    car = string.printable


    Si le but est de créer une structure qui compte la distribution des caractères ASCII dans une chaîne de caractère
    code1
    , voici comment je procèderais :

    import string
    from pprint import pprint
    from collections import defaultdict
    
    def compute_distribution(s):
      distribution = defaultdict(lambda: 0)
      for a in s:
        if a in string.printable:
          distribution[a] += 1
      return distribution
    
    pprint(compute_distribution("ababaabc"))


    Bonne chance
    0