如何将其转换为lambda函数?

2024-05-19 18:48:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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函数。我该怎么做呢?你知道吗


Tags: intxtforlineitems学生totalgrade
2条回答

我将构建一个字典(使用dictionary comprehension),key:student name,value:mean of student mark,根据空格拆分并定义lambda来计算平均值(将所有值的列表理解传递给它,这样它就可以在不使用迭代器的情况下计算sumlen):

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用于返回名称(根据第一个空格字符进行拆分)。你知道吗

这是一行代码,包括:列表理解,dict理解,lambda。复杂,但逻辑性和性能(尽管split部分做了两次,因为行中的数据是异构的:name&marks)

无需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))
  1. 您可以逐行遍历文件,而不必使用这种过于复杂的with语法。您也不需要'r'参数,因为它是默认参数。你知道吗
  2. grades中的每个值转换为整数,然后求和。你知道吗
  3. 我去掉了一些不必要的括号。你知道吗

如果您有Python3.x,您可以编写更漂亮的代码:

for line in open('studentdata.txt'):
    # 1
    name, *grades = line.split()

    # 2
    total = sum(map(int, grades))
    print (name, total/len(grades))
  1. 这只是小菜一碟!从line.split返回的列表中提取一个值,将其放入name,然后将剩下的-放入列表grades。你知道吗
  2. 您可以去掉变量total,将sum(...)移到对print的调用中以保存一行代码,但这可能会影响可读性,因此我不建议这样做。你知道吗

相关问题 更多 >