【发布时间】:2020-10-29 07:40:45
【问题描述】:
我有一个这样的列表
l=[[Alex,12],[John,14],[Ross,24],[Alex,42],[John,24],[Alex,45]]
我应该如何处理这个列表,我得到这样的输出
l=[[Alex,33],[John,19],[Ross,24]]
这基本上是每个名字的平均分数。
【问题讨论】:
标签: python arrays list arraylist
我有一个这样的列表
l=[[Alex,12],[John,14],[Ross,24],[Alex,42],[John,24],[Alex,45]]
我应该如何处理这个列表,我得到这样的输出
l=[[Alex,33],[John,19],[Ross,24]]
这基本上是每个名字的平均分数。
【问题讨论】:
标签: python arrays list arraylist
使用 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]]
【讨论】:
l,你的名单有问题。我使用了有问题的命名并添加了编辑以使其更清晰。如果可以的话,请查看stackoverflow.com/help/someone-answers 以了解如何接受答案。谢谢
df = pd.DataFrame(l,columns=['name','value','value1']) 然后l = df.groupby('name')['value','value1'].mean().reset_index().values.tolist()
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 来简化
【讨论】:
让我们通过构造新的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_
解释
key,即person name,如果它已经存在于字典中,我们将得到它的值,即list of 2 int items[acumaltive_score , counter]这会将我们发送到 #3。如果不是,我们输入 #2
key(字典中的人名)并将其值设置为新的2个项目列表[current_score, 1],1是第一个分数。它是counter,我们稍后需要它来进行average 计算。keys和items,所以我们在每次迭代中得到key(人名)和value(2个项目的列表,第一项是total score,第二项是number of the scores)。0 index 中是当前键的人名,在 @987654340 @平均值是v[0]/v[1]。请记住,此代码在某些情况下会引发异常。考虑使用try-except
【讨论】:
if-else 旧学校代码的pythonic 解决方案。如果你觉得它有用,我会很高兴你接受它。再次感谢:-)