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