Agrégation dans des listes python

Bonjour,

Comme vous pouvez le voir je débute en programmation. Je voulais savoir comment réaliser cette opération de manière propre en Python. Il s'agit d'agréger les valeurs d'un champ nommé "valeur" à partir d'un champ contenant des identifiants. Il s'agit en quelque sorte de réaliser un group by et une opération d'agrégation comme on le ferait en SQL

#liste des identifiants des enregistrements
ID= [1,2,1,2,4,3,3,3,5,5,1,5,5,1,2,2,2]

#liste des valeurs associées enregistrements
valeur=[1,4,15,16,23,27,48,50,55,67,90,101,200,250,260,270,300]

#liste unique des identifiants
IDunique=[1,2,3,4,5]

#liste vide
li3=[]

for i in range(0, len(IDunique)): #boucle dans les ID uniques
li3.append([elt== IDunique[i] for elt in ID])
li4=li3[i] #créer une variable li4 accueillant les sous-listes
li5=[]#créer une variable vide li5
for j in range(0, len(li4)):#bouble dans les sous-listes
if li4[j]==True:#test si la valeur est True
li5.append(valeur[j])#ajoute la valeur de liste valeur si la valeur est True
moyenne= sum(li5)/len(li5) #calcul la moyenne des sous-listes
minnus=min(li5)#calcul la valeur minimale
maxus= max(li5)#calcul la valeur maximale
print IDunique[i],moyenne, minnus,maxus #print l'IDunique, la moyenne, le min, le max

2 réponses

  1. Bonjour,

    Voici comment, en simplifiant progressivement ton code en utilisant les outils offerts par python, on arrive à condenser ton code:

    #liste des identifiants des enregistrements   
    ID= [1,2,1,2,4,3,3,3,5,5,1,5,5,1,2,2,2]   
    
    #liste des valeurs associées enregistrements   
    valeur=[1,4,15,16,23,27,48,50,55,67,90,101,200,250,260,270,300]   
    
    #liste unique des identifiants   
    IDunique=[1,2,3,4,5]   
    
    #liste vide   
    li3=[]   
    
    for i in range(0, len(IDunique)): #boucle dans les ID uniques  
        print 'i ==',i,'   IDunique[i] ==',IDunique[i]  
        li3.append([elt== IDunique[i] for elt in ID])  
        li4=li3[i] #créer une variable li4 accueillant les sous-listes  
        print 'li4 ==',li4  
          
        li5=[]#créer une variable vide li5  
        for j in range(0, len(li4)):#boucle dans les sous-listes   
            if li4[j]==True:#test si la valeur est True   
                li5.append(valeur[j])#ajoute la valeur de liste valeur si la valeur est True  
        print 'li5 ==',li5  
          
        moyenne= sum(li5)/len(li5) #calcul la moyenne des sous-listes   
        minnus=min(li5)#calcul la valeur minimale   
        maxus= max(li5)#calcul la valeur maximale   
        print IDunique[i],' : ',moyenne, minnus,maxus #print l'IDunique, la moyenne, le min, le max   
        print  
    
    
    print '\n -1-  #################################'  
    for x in IDunique:  
        li4 = [elt== x for elt in ID]  
        print 'li4 ==',li4  
          
        li5=[]  
        for j,y in enumerate(li4):   
            if y:   
                li5.append(valeur[j])  
        print 'li5 ==',li5  
          
        moyenne,minnus,maxus= sum(li5)/len(li5),min(li5),max(li5)   
        print 'x de IDunique ==',x,' : ',moyenne, minnus,maxus  
        print  
    
    
    print '\n -2-  #################################'  
    for x in IDunique:  
        li4 = [elt== x for elt in ID]  
        print 'li4 ==',li4  
          
        li5 = [ valeur[j] for j,y in enumerate(li4) if y ]  
        print 'li5 ==',li5  
          
        moyenne,minnus,maxus= sum(li5)/len(li5),min(li5),max(li5)   
        print 'x de IDunique ==',x,' : ',moyenne, minnus,maxus  
        print  
    
    
    print '\n -3-  #################################'  
    for x in IDunique:  
        li = [ valeur[j] for j,z in enumerate(ID) if z==x ]  
        print 'li ==',li  
          
        moyenne,minnus,maxus= sum(li)/len(li),min(li),max(li)   
        print 'x de IDunique ==',x,' : ',moyenne, minnus,maxus   
        print  
    
          
    print '\n -4-  #################################'  
    for x in IDunique:  
        li = [b for a,b in zip(ID,valeur) if a==x]  
        print 'li ==',li  
        tu = (x,sum(li)/len(li),min(li),max(li))  
        print '%s :  %s , %s , %s' % tu  
        print  
    
    
    print '\n -5-  #################################'  
    for x in IDunique:  
        li = [b for a,b in zip(ID,valeur) if a==x]  
        tu = (x,sum(li)/len(li),min(li),max(li))  
        print '%4s :  %7s , %7s , %7s' % tu  
        print  
    
    
    print '\n -6-  #################################'  
    def func(x, zozo = zip(ID,valeur)):  
        li = [b for a,b in zip(ID,valeur) if a==x]  
        return (x,sum(li)/len(li),min(li),max(li))  
    
    litu = [func(x) for x in IDunique]  
    print '\n'.join('%4s :  %7s , %7s , %7s' % tu  
                    for tu in litu)


    Tu devrais aller sur le forum Python de developpez.com pour les questions sur ce langage, il y a une super équipe, sympa et très compétente.
    1. Merci beaucoup pour ta réponse.
      Je jette un coup d'oeil au code et au site que tu m'as indiqué.

      Merci encore