Agrégation dans des listes python

tygrys -  
 Tygrys -
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. heyquem Messages postés 808 Statut Membre 131
     
    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.
    0
  2. Tygrys
     
    Merci beaucoup pour ta réponse.
    Je jette un coup d'oeil au code et au site que tu m'as indiqué.

    Merci encore
    0