我有一个学生名单和一些笔记,我必须找到每个学生的平均成绩,并按照以下方式向他们显示(如果平均成绩大于或等于6.0):
[学生姓名,平均值](按平均值的降序排列)。
我这样做了,但是问题是我有2个均值,并且我不能与该学生的姓名对应,在这两种情况下,他都将我的第一个学生的平均分为6.0。
我的列表如下:
info = [['Frank Morgan', '7.89', '3.19', '6.90', '9.90'], ['Jesse Lawrence', '6', '6', '6', '6'], ['Mark Porter', '9.00', '7.87', '9.12', '10.00'], ['Philip Sanchez', '6', '6', '6', '6']]
average= [6.970000000000001, 6.0, 8.9975, 6.0]
我要创建以下内容:
result = [['Frank Morgan', 6.970000000000001], ['Jesse Lawrence', 6.0],['Mark Porter', 8.9975], ['Philip Sanchez', 6.0]]
我尝试了以下方式:
result = []
for i in average:
if i >= 6.0:
result.append([info[average.index(i)][0], i])
print result
但是我得到了
result = [['Frank Morgan', 6.970000000000001], ['Jesse Lawrence', 6.0],['Mark Porter', 8.9975], ['Jesse Lawrence', 6.0]]
“杰西·劳伦斯”代替“菲利普·桑切斯”
请帮助我找到此匹配问题的另一种解决方案。
答案 0 :(得分:0)
在numpy
和itertools.groupby的帮助下,您可以这样做:
[[k, np.mean(np.array(list(g)[0][1:], dtype='float'))] for k, g in itertools.groupby(sorted(a, key=lambda x: x[0]), lambda x: x[0])]
并获得:
[['Frank Morgan', 6.970000000000001],
['Jesse Lawrence', 6.0],
['Mark Porter', 8.9975],
['Philip Sanchez', 6.0]]
答案 1 :(得分:0)
当您执行info[average.index(i)]
时,average.index(i)
将平均返回首次出现的i
。
您可以使用enumerate()
info = [['Frank Morgan', '7.89', '3.19', '6.90', '9.90'], ['Jesse Lawrence', '6', '6', '6', '6'], ['Mark Porter', '9.00', '7.87', '9.12', '10.00'], ['Philip Sanchez', '6', '6', '6', '6']]
average= [6.970000000000001, 6.0, 8.9975, 6.0]
for idx, value in enumerate(average):
if value >= 6.0:
result.append([info[idx])][0], value])
print result
甚至更好-使用zip()
info = [['Frank Morgan', '7.89', '3.19', '6.90', '9.90'], ['Jesse Lawrence', '6', '6', '6', '6'], ['Mark Porter', '9.00', '7.87', '9.12', '10.00'], ['Philip Sanchez', '6', '6', '6', '6']]
average= [6.970000000000001, 6.0, 8.9975, 6.0]
result = []
for student, value in zip(info, average):
if value >= 6.0:
result.append([student[0], value])
print result
作为旁注-开始使用python3