我有一个具有以下格式的列表:
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上表达我的问题,所以我找不到任何帮助。有谁知道如何做到这一点?如果该问题重复,请告诉我(并提供链接以便我学习),然后我可以删除此问题。谢谢!
答案 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)