Fonction ne fonctionne pas dans la boucle for

Signaler
-
Messages postés
29801
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 mai 2021
-
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

Messages postés
1048
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
16 mai 2021
112
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()
Messages postés
29801
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 mai 2021
7 092
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