在Python 3中查找列表中字符串的平均值

时间:2015-05-04 15:47:00

标签: python python-3.x

我有一个像这样的分数列表:

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"]

3 个答案:

答案 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

click here to see the execution