如何将其转换为lambda函数?

时间:2017-02-27 20:16:23

标签: python lambda

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函数使其更简单。我该怎么做呢?

2 个答案:

答案 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))
  1. 您可以逐行迭代文件,而不会使用过于复杂的with语法。您也不需要'r'参数,因为它是默认值。
  2. 您将grades中的每个值转换为整数,然后将它们相加。
  3. 我删除了一些不必要的括号。
  4. 如果你有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))
    
    1. 这只是小菜一碟!您从line.split返回的列表中提取一个值,将其放入name并将任何剩余的 - 提取到列表grades中。
    2. 您可以删除变量total并将sum(...)右移到print的调用中以保存一行代码,但这可能会损害可读性,所以我不推荐这个。

答案 1 :(得分:1)

我将使用键:学生姓名和值来构建字典(使用字典理解):学生标记的平均值,根据空格分割并定义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用于返回名称(根据第一个空格字符分割)。

所以这是一个单行,包括:列表理解,字典理解和lambda。复杂,但逻辑性和高性能(split部分有两次完成,因为数据在行中是异质的:名称和标记)