Calcule de moyennes en Boucle dans une liste

Fermé
Johny34110 Messages postés 5 Date d'inscription dimanche 29 mai 2022 Statut Membre Dernière intervention 31 mai 2022 - 29 mai 2022 à 09:23
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 - 31 mai 2022 à 14:18
Bonjour à la communauté !

Je viens vers vous pour ,je l'espère trouver une réponse sur un sujet que je bloque depuis quelques jours ...
En effet j'ai une liste sur python de 300 éléments et j'aimerais calculer la moyenne des 4 premières valeurs puis des 4 suivantes etc.... jusqu'à la fin.
Pour enfin faire la moyenne de toutes ces moyennes ....

Je pensais faire la moyenne avec la commande : [0-4] [5-9] pour prendre que les 4 valeurs à chaques fois de ma liste mais sur 300 éléments... ca fais beaucoup à taper ..
Si vous avez une idée pour une boucle qui permettrait de le faire automatiquement ????

Merci d'avance a vous tous ❤️


Configuration: Android / Chrome 101.0.4951.61
A voir également:

7 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
29 mai 2022 à 09:54
Bonjour

Tout d'abord une remarque
j'aimerais calculer la moyenne des 4 premières valeurs puis des 4 suivantes etc.... jusqu'à la fin.
Pour enfin faire la moyenne de toutes ces moyennes ....

D'un point de vue strictement mathématique, faire la moyenne de tous les éléments en une seule fois te donnera le même résultat.
En informatique, il peut y avoir une différence sensible, mais ce sera dû à la façon de transcrire les nombre décimaux en binaire qui arrondit beaucoup de valeurs à un plus proche que l'on peut coder.
Et donc pour obtenir un résultat le plus vrai possible, il est préférable de faire la moyenne d'un coup.
Sauf bien sûr, si les moyennes intermédiaires ont de l'intérêt pour toi (et encore que....)
Si tu n'es pas sensibilisé à ce point, voir ceci https://forums.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3

Bref, maintenant que tu es averti, une solution est de faire une boucle dans une boucle, une autre est de faire une boucle qui va de 4 en 4
0
Utilisateur anonyme
Modifié le 29 mai 2022 à 09:57
Bonjour,

Je ne code pas en Python, mais la logique devrait être la même que dans les autres langages.
Initialise une variable
nbLoop
en dehors de ta boucle avec la valeur 0, et une autre
tmpTotal
qui servira à stocker le total des 4 dernières valeurs.
Pour chaque tour de boucle, ajoute 1 sur
nbLoop
, et tu additionnes
tmpTotal
.
Lorsque tu atteins 4, remet
nbLoop
à 0 et recommence ton addition dans
tmpTotal
.

0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 29 mai 2022 à 10:21
Bonjour,

En dehors de l'aspect signalé par Whismeril, c'est typiquement le rôle d'une boucle avec un pas d'incrément, 4 dans ton cas. Exemple
import random
taille=32
tab = [random.randint(0, 100) for x in range(taille)]
print(tab)
cumulGlobal=0
for i in range(0,taille,4):
    print("i =",i)
    cumul=0
    for j in range(4):
        print("    j =",j," i+j =",i+j,"tab[i+j} =",tab[i+j])




0
Johny34110 Messages postés 5 Date d'inscription dimanche 29 mai 2022 Statut Membre Dernière intervention 31 mai 2022
29 mai 2022 à 20:55
Merci
j'ai éssayer d'intégrer le code au mien mais j'obtiens cette erreur
" line 40, in <module>
for i in range(0,turbi,4):
TypeError: 'list' object cannot be interpreted as an integer

voilà mon programme:
turbi = []
prof = []
temp = []
date = []
a = 4 # convertir min
b = 4 * 24
c = 4 * 24 * 7
with open("C:\\Users\John\Desktop\PYTHON\Poizot\STBD_33002_20130712_085653.txt",
"r") as data: # ouverture et lecture des datas

data = [e.replace(',', '.') for e in data]
data = data[5:]


for ligne in data: # lecture des lignes dans data , exclusion des 6 premieres

liste = ligne.split(';') # supprimation des espaces
turbi.append((float(liste[0])))
prof.append((float(liste[1])))
temp.append((float(liste[2])))
date.append(((liste[3])))

cumulGlobal=0
for i in range(0,turbi,4):

cumul=0
for j in range(4):
print(" j =",j," i+j =",i+j,"tab[i+j} =",tab[i+j])

si vous pouvez m'aider ? :)
merci
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
29 mai 2022 à 21:06
En Python, l’indentation est primordiale, or par défaut le site ne la conserve pas.
Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
On pourra commencer à essayer de t’aider quand tu auras reposté correctement ton code.
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 29 mai 2022 à 21:14
peut être len(turbi), pas turbi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Johny34110 Messages postés 5 Date d'inscription dimanche 29 mai 2022 Statut Membre Dernière intervention 31 mai 2022
Modifié le 30 mai 2022 à 08:36
Merci pour le petit tuto whismeril , de mon coté sa n'avance toujours pas vraiment je suis toujours bloqué sur la partie
boucle de jee pee

turbi = []
prof = []
temp = []
date = []
a = 4  # convertir min
b = 4 * 24
c = 4 * 24 * 7
with open("C:\\Users\John\Desktop\PYTHON\Poizot\STBD_33002_20130712_085653.txt",
          "r") as data:  # ouverture et lecture des datas

    data = [e.replace(',', '.') for e in data]
    data = data[5:]
    

for ligne in data:  # lecture des lignes dans data , exclusion des 6 premieres

    liste = ligne.split(';')  # supprimation des espaces
    turbi.append((float(liste[0])))
    prof.append((float(liste[1])))
    temp.append((float(liste[2])))
    date.append(((liste[3])))
MoyTh = sum(turbi) / (len(date) *a )
MoyPh = sum(prof) / (len(date) * a)
MoyTph = sum(temp) / (len(date) * a)

MoyTj = sum(turbi) / (len(date) * b)
MoyPj = sum(prof) / (len(date) * b)
MoyTpj = sum(temp) / (len(date) * b)

MoyTs = sum(turbi) / (len(date) * c)
MoyPs = sum(prof) / (len(date) * c)
MoyTps = sum(temp) / (len(date) * c)






taille=len(turbi)
tab = [random.randint(0, 100) for x in range(taille)]
print(tab)
cumulGlobal=0
for i in range(0,taille,4):
    print("i =",i)
    cumul=0
    for j in range(4):
        print("    j =",j," i+j =",i+j,"tab[i+j} =",tab[i+j])


je vois pas trop comment l'adapter pour mon projet :/
si vous pouvez m'éclairer ! merci d'avance
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 30 mai 2022 à 10:17
Bonjour,

A mon avis, les lignes 15 à 21 devraient être indentées, donc sous le with()
Je me demande comment se présente ton fichier texte ...
Sinon:
# ouverture et lecture des datas : pas de s a data, c'est déjà un mot au pluriel (singulier : datum)
# supprimation des espaces : c'est plutôt suppression :-) :-)
et calcul de moyennes
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 30 mai 2022 à 10:50
Si les valeurs à traiter sont dans turbi :

cumulGlobal=0
moyenne4=[]
for i in range(0,len(turbi),4):
    print("i =",i)
    cumul=0
    for j in range(4):
        print("    j =",j," i+j =",i+j,"turbi[i+j] =",turbi[i+j])
        cumul += turbi[i+j]
        cumulGlobal += turbi[i+j]
    moyenne4.append(cumul/4)
    print(moyenne4)
moyenneGlobale = cumulGlobal / len(turbi)
print(moyenneGlobale)    


tu peux te passer de cumulGlobal si en fin tu effectues la moyenne des moyennes, tu pourrais te passer de la boucle j si tu mets en dur les 4 indices i, i+1, i+2, i+3 pour calculer la moyenne directe, tu peux utiliser sum(turbi), ... suivant ce que tu connais des instructions, mais utiliser les boucles i et j avec des prints doit te permettre de décomposer l'algorithme

moyenneGlobale = sum(turbi)/len(turbi)   
moyenne4=[]
for i in range(0,len(turbi),4):
    moyenne4.append((turbi[i]+turbi[i+1]+turbi[i+2]+turbi[i+3])/4)
1
Johny34110 Messages postés 5 Date d'inscription dimanche 29 mai 2022 Statut Membre Dernière intervention 31 mai 2022
31 mai 2022 à 07:16
Merci à tous pour votre aide !
Ducoup après bidouillages je suis partie sur une boucle permettant de calculer mes moyennes du type :

i , pas = 0,4
while 1:
    s=0
    try:
        for x in range(pas):
            s=s+turbi[i+x]        #calcule de la somme
        MoyTh.append(s/pas)       #Liste apprend les valeurs somme/pas
        i=i+pas                   #passer aux "pas" suivant
    except:
        break
MoyTh1= sum(MoyTh)/len(MoyTh)


Merci encore!
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 31 mai 2022 à 07:47
bidouillages c'est exactement ce que je pensais en lisant ton code. Tu cherches les complications, gérer un indice à la main alors qu'une boucle le fait mieux et surtout la sortie est horrible, générer une erreur d'indice pour quitter. C'est comme scier la branche sur laquelle on est assis, juste pour ne pas avoir à prendre la décision de sauter pour descendre ;-)
0
Johny34110 Messages postés 5 Date d'inscription dimanche 29 mai 2022 Statut Membre Dernière intervention 31 mai 2022
31 mai 2022 à 14:03
j'étais obligé de créer une boucle avec condition car sinon j'avais une erreur de range quand j'utilisais le tien , car je penses qu'il était impossible de classer toute les valeurs de la liste par groupe de 4.
De plus , j'ai commencé python il y'a une semaine, donc forcement je suis pas encore un "maitre" dans le domaine.
Mais merci pour la remarque...
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
31 mai 2022 à 14:18
Tu peux utiliser la division entière //
for i in range(0,(len(turbi)//4)*4,4):    


Après une question pratique se pose quand les valeurs ne sont pas des multiples de 4, comment moyenne générale doit être évaluée, avec toutes les valeurs, ou seulement celles retenues dans les groupes par 4 ?
0