如果使用Python满足条件,则查找列表元素的平均值?

时间:2019-12-29 17:26:18

标签: python python-3.x list math

我有一个具有以下格式的列表:

mylist = ["Joe, 100%", "Joe, 80%", "Joe, 90%", "Sally, 95%", "Sally, 80%", "Jimmy, 90%", ...]

我想做的是,首先计算每个名字出现的次数。如果一个名称出现2次或更多次,请将该名称与平均百分比一起附加。因此,我试图获得以下输出:

newlist = ["Joe, 90%", "Sally, 87.5%"]

要尝试此操作,我做了mylist.split(", ")仅获得名称,并使用Counter()查找了该名称出现了多少次。然后,如果名称出现2次或更多次,我使用了一个简单的if >= 2语句将名称附加到newlist上。

但是,尽管尝试了许多不同的方法,但是我无法弄清楚如何用最终列表中的名称重新获得百分比。我也不确定如何在Google上表达我的问题,所以我找不到任何帮助。有谁知道如何做到这一点?如果该问题重复,请告诉我(并提供链接以便我学习),然后我可以删除此问题。谢谢!

2 个答案:

答案 0 :(得分:6)

您可以尝试以下方法:

from collections import defaultdict
counts = defaultdict(int)
percents = defaultdict(int)

for item in mylist:
    name, percent = item.split(',')
    percent = int(percent.lstrip().rstrip('%'))
    percents[name]+=percent
    counts[name]+=1

result = []
for k,v in counts.items():
    if v > 1:
        result.append(f"{k}, {percents[k]/v}%")
print(result)

输出

['Joe, 90.0%', 'Sally, 87.5%']

答案 1 :(得分:1)

我建议您创建一个分数的字典,其中的键将是名称,值是其分数的列表。此代码段显示了如何实现此目标:

mydict = {}
for item in mylist:
    name, score = item.split(", ") # splits each item into a score and a name
    score = float(score.replace("%", "")) # converts string score to a float
    if mydict[name]: # checks if the name already exists in the dictionary
        mydict[name].append(score)
    else:
        mydict[name] = [score]

这将为您提供按其名称组织的分数字典。现在您所要做的就是将字典中的分数平均:

newlist = []
for name in mydict:
    if len(mydict[name]) >= 2:
        average = str(sum(mydict[name]))/len(mydict[name])) + "%"
        straverage = name + ", " + average
        newlist.append(straverage)