В списке списков, как найти среднее значение значений, связанных с внутренними списками? - PullRequest
2 голосов
/ 08 июля 2020

У меня есть такой список

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

как мне обработать этот список, чтобы получить такой вывод

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

, который в основном представляет собой среднее количество баллов для каждого имени .

Ответы [ 3 ]

1 голос
/ 08 июля 2020

позволяет упростить задачу, построив на его основе новый dict, где ключи - это имена или первый элемент внутреннего списка, а значение - среднее. поскольку ключи уникальны в python dicts, это становится легко. после этого мы сгенерируем новый список из сконструированного dict, и это будет наш ответ.

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_

объяснения

  1. в # 1 мы пытаемся получить key, который является person name, если он уже существует в dict, мы получим его значение, которое является list of 2 int items [acumaltive_score , counter], и это отправит нас на остальное на # 3 . если нет, мы вводим # 2
  2. здесь мы добавляем key (имя человека в dict) и устанавливаем его значение как новый список из 2 элементов [current_score, 1], 1 - первая оценка. его a counter нам понадобится позже для average вычислений.
  3. мы получаем здесь # 3 , потому что этот человек уже существует в dict. поэтому мы добавляем его текущий счет к счетам и в # 4 увеличиваем счетчик на 1.
  4. мы объясняем это (увеличивая счетчик на 1)
  5. в # 5 мы перебираем слова keys и items, поэтому на каждой итерации мы получаем key (имя человека) и value (список из 2 элементов, первый элемент - это total score, а второй - number of the scores).
  6. здесь, в # 6 , мы создаем наш окончательный список, добавляя новый список (опять же из 2 элементов в 0 index имя человека, которое является текущим ключом, и в index 1 среднем значении v[0]/v[1].

учтите, что этот код может вызывать исключения в некоторых случаях. рассмотреть возможность использования try-except

1 голос
/ 08 июля 2020

Используйте pandas для группировки по имени и вычисления среднего (l - ваш список):

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

вывод:

[['Alex', 33], ['John', 19], ['Ross', 24]]
1 голос
/ 08 июля 2020
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)

это должно вернуть следующий список:

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

Я не использовал какой-либо пакет, поскольку в вашем примере кода не было импорта. Его можно упростить с помощью numpy или pandas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...