Agrégation dans des listes python

Fermé
tygrys - Modifié par tygrys le 11/12/2011 à 00:50
 Tygrys - 11 déc. 2011 à 11:52
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

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 11/12/2011 à 08:43
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
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