我有一个像这样的分数列表:
scores = ["Bob Foo - 10 / 20\n",
"Jim Foo - 5 / 20\n",
"Bob Foo - 7 / 20\n",
"Jack T - 6 / 20\n",
"Jack T - 4 / 20\n",
"Bob Foo - 9 / 20\n"]
我需要尝试找到每个人的平均分数,并将其四舍五入到最接近的整数。该列表可能会改变其规模,名称将更改,但它将始终具有以下格式: 名字 姓氏 - 得分 / 20.
我想输出类似的内容:
>>> Bob Foo - 9
Jim Foo - 5
Jack T - 5
我真的不知道该怎么做。我知道有关已排序的函数以及如何指定密钥但我不知道这是否有用。
我最接近的是:
for score in scores:
print(re.split(r'[-/]',score))
甚至没有关闭,因为它所做的就是将列表拆分并给我这个:
>>>
['Bob Foo ', ' 10 ', ' 20\n']
['Jim Foo ', ' 5 ', ' 20\n']
['Bob Foo ', ' 7 ', ' 20\n']
['Jack T ', ' 6 ', ' 20\n']
['Jack T ', ' 4 ', ' 20\n']
['Bob Foo ', ' 9 ', ' 20\n']
>>>
我怎样才能克服这一点?我可以创建一个函数来查找列表中每个人的平均分数吗?
编辑:
我可以将分数列表简化为更简单的格式。例如:
scores = ["Bob Foo 10\n",
"Jim Foo 5\n",
"Bob Foo 7\n",
"Jack T 6\n",
"Jack T 4\n",
"Bob Foo 9\n"]
答案 0 :(得分:1)
我发现划分和征服编程任务很有用。将复杂的任务划分为一系列简单的任务。要么你知道如何单独做每一个,要么你可以在你正在努力的部分获得更有针对性的帮助。
作为一个例子,我将如何解决这个问题:
import re
scores = ["Bob Foo - 10 / 10\n",
"John Smith - 5 / 10\n",
"Bob Foo - 7 / 10\n",
"Jack T - 6 / 10\n",
"Jack T - 4 / 10\n",
"Bob Foo - 9 / 10\n"]
# First, split the names and scores up
scores = [re.match('(\S+ \S+) - (\d+)', score).groups() for score in scores]
#print (scores)
# Convert the number string into an integer
scores = [[score[0], int(score[1])] for score in scores]
#print (scores)
# Create a dictionary, keyed by the name
names = set(score[0] for score in scores)
scores = {
name: [score[1] for score in scores if name == score[0]]
for name in names
}
# print (scores)
# Compute the average for each name
scores = {
name: sum(score)/len(score)
for name, score in scores.items()
}
print (scores)
答案 1 :(得分:0)
parts = [score.split("-",1) for score in scores]
会将您之前演示的数据分解,除非它只是将其分成名称,休息,现在您只需要保存它
data = {}
for name,score in parts:
try:
data[name].append(score)
except KeyError:
data[name] = [score,]
print data
现在你已经按照名称对得分进行了分组,所以现在你需要做的就是将得分转换为实际的int
(或者更好的float
)
并平均每个名字的得分
答案 2 :(得分:0)
试试这个。它可能会帮到你
import math
scores = ["Bob Foo - 10 / 10\n",
"John Smith - 5 / 10\n",
"Bob Foo - 7 / 10\n",
"Jack T - 6 / 10\n",
"Jack T - 4 / 10\n",
"Bob Foo - 9 / 10\n"]
d={}
for i in xrange(len(scores)):
str=scores[i].split("-");
try:
(d[str[0]])[0] +=int((str[1].split("/"))[0])
(d[str[0]])[1] +=1
except:
d[str[0]]=[0,0]
(d[str[0]])[0]=int((str[1].split("/"))[0])
(d[str[0]])[1]=1
//store sum and count in a dictionary
for x in d:
print x,((d[x])[0]/((d[x])[1])*1.0)
并在最后一个语句中应用适当的函数ceil或floor。或round