2 votes

Dans une liste de listes, comment trouver la moyenne des valeurs associées aux listes intérieures ?

J'ai une liste comme celle-ci

l=[[Alex,12],[John,14],[Ross,24],[Alex,42],[John,24],[Alex,45]]

Comment dois-je traiter cette liste pour obtenir un résultat comme celui-ci ?

l=[[Alex,33],[John,19],[Ross,24]]

qui est en fait la moyenne des notes obtenues pour chaque nom.

1voto

Skander HR Points 450
l = [['Alex',12],['John',14],['Ross',24],['Alex',42],['John',24],['Alex',45]]

score_dict = {}

for l_score in l:
    name = l_score[0]
    score = l_score[1]
    if name in score_dict.keys():
        score_dict[name].append(score)

    else:
        score_dict[name] = [score]

ret_list = []
for k, v in score_dict.items():
    sum_l = sum(v)
    len_l = len(v)
    if len_l > 0:
        avg = float(sum_l)/float(len_l)
    else:
        avg = 0
    ret_list.append([k,avg])

print(ret_list)

Cette opération devrait permettre d'obtenir la liste suivante :

[['Ross', 24.0], ['Alex', 33.0], ['John', 19.0]]

Je n'ai pas utilisé de package car il n'y avait pas d'importation dans votre exemple de code. Il peut être simplifié avec numpy ou pandas

1voto

nor Points 2498

Permet de simplifier le problème, en construisant de nouvelles dict où les clés sont les noms ou le premier élément de la liste intérieure et la valeur est la moyenne. Comme les clés sont uniques dans les dicts de Python, cela devient facile. Après avoir fait cela, nous allons générer une nouvelle liste à partir du dict construit et ce sera notre réponse.

TheOriginalList=[[Alex,12],[John,14],[Ross,24],[Alex,42],[John,24],[Alex,45]] 

aux_dict = {}
for inner_list in TheOriginalList:
    if not aux_dict.get(inner_list[0],None):           #_1_
        aux_dict[inner_list[0]]=[inner_list[1],1]      #_2_
    else:
        aux_dict[inner_list[0]][0]+= inner_list[1]     #_3_
        aux_dict[inner_list[0]][1]+= 1                 #_4_

final_list = []
for k,v in aux_dict.items():                           #_5_
    final_list.append([k,v[0]/v[1]])                   #_6_

explications

  1. dans # 1 nous essayons d'obtenir la key qui est le person name s'il existe déjà dans le dict, nous obtiendrons sa valeur, qui est un list of 2 int items [acumaltive_score , counter] et cela nous enverra à la page else to # 3 Si ce n'est pas le cas, nous entrons dans le #. 2
  2. nous ajoutons ici le key (nom de la personne dans le dict) et définit sa valeur comme une nouvelle liste de 2 éléments [current_score, 1] , 1 est le premier score. counter nous en aurons besoin plus tard pour average calculs.
  3. we get here # 3 car cette personne existe déjà dans le dict. nous ajoutons donc son score actuel aux scores et dans # 4 nous incrémentons le compteur de 1.
  4. nous l'expliquons (en incrémentant le compteur de 1)
  5. dans # 5 nous itérons sur le dict keys y items Nous obtenons donc à chaque itération la key (nom de la personne) et le value (liste de 2 éléments, le premier élément est le total score et le second est le number of the scores ).
  6. ici au # 6 nous construisons notre liste finale, en y ajoutant une nouvelle liste (à nouveau une liste de 2 éléments, dans le modèle 0 index le nom de la personne qui est la clé actuelle et en index 1 la moyenne qui est la v[0]/v[1] .

Gardez à l'esprit que ce code peut soulever des exceptions dans certains cas. envisagez d'utiliser try-except

1voto

Ehsan Points 10771

Utiliser pandas pour grouper par nom et calculer la moyenne ( l est votre liste) :

import pandas as pd
df = pd.DataFrame(l,columns=['name','value'])
l = df.groupby('name').value.mean().reset_index().values.tolist()

df :

   name  value
0  Alex     12
1  John     14
2  Ross     24
3  Alex     42
4  John     24
5  Alex     45

de la production :

[['Alex', 33], ['John', 19], ['Ross', 24]]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X