joe 10 15 20 30 40
bill 23 16 19 22
sue 8 22 17 14 32 17 24 21 2 9 11 17
grace 12 28 21 45 26 10
john 14 32 25 16 89
使用上面的文本文件studentdata.txt,我编写了一个计算每个学生平均成绩的程序,并打印出学生的姓名及其平均成绩。这是我的代码:
with open('studentdata.txt','r') as f:
for line in f:
items = line.split()
total = 0
grades = items[1:]
for grade in grades:
total = total + int(grade)
print (items[0], (total/(len(grades))))
它有效,但我想使用lambda函数使其更简单。我该怎么做呢?
答案 0 :(得分:1)
您可以在没有lambda函数的情况下简化此操作:
# 1
for line in open('studentdata.txt'):
items = line.split()
grades = items[1:]
# 2
total = sum(map(int, grades))
# 3
print (items[0], total/len(grades))
with
语法。您也不需要'r'
参数,因为它是默认值。 grades
中的每个值转换为整数,然后将它们相加。 如果你有Python 3.x,你可以编写更好看的代码:
for line in open('studentdata.txt'):
# 1
name, *grades = line.split()
# 2
total = sum(map(int, grades))
print (name, total/len(grades))
line.split
返回的列表中提取一个值,将其放入name
并将任何剩余的 - 提取到列表grades
中。total
并将sum(...)
右移到print
的调用中以保存一行代码,但这可能会损害可读性,所以我不推荐这个。答案 1 :(得分:1)
我将使用键:学生姓名和值来构建字典(使用字典理解):学生标记的平均值,根据空格分割并定义lambda以计算均值(将所有值的列表理解传递给它,因此它可以在其上计算sum
和len
而不使用迭代器):
with open(".txt") as f:
data = [{item.partition(" ")[0]:(lambda x:sum(x)/len(x))([int(x) for x in item.split()[1:]])} for item in f]
结果:
[{'joe': 23.0}, {'bill': 20.0}, {'sue': 16.166666666666668}, {'grace': 23.666666666666668}, {'john': 35.2}]
str.partition
用于返回名称(根据第一个空格字符分割)。
所以这是一个单行,包括:列表理解,字典理解和lambda。复杂,但逻辑性和高性能(split
部分有两次完成,因为数据在行中是异质的:名称和标记)