在Python中创建类的实例(对象)列表,而不使用显式列表理解或for循环

2024-05-29 00:28:29 发布

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

这里的目标是创建一个具有单一属性(分数)的类(比如教师),如下所示:

import numpy as np
maxScore = 10
numTeach = 50

class Teacher:

    counter = 0

    def __init__(self, score):
         self.score = score
    
    # code to keep track of the number of objects created
    Teacher.counter += 1
    
    def get(self):
        return self.score

我如何在不使用任何列表理解的情况下(可能来自矢量化或广播),创建该班主任的实例(对象)的随机可变长度列表

就结果而言,我有以下代码就足够了,但这不是我希望使用的解决方案:

teacher_list = [Teacher(np.random.randint(1,maxScore+1)) for i in range(np.random.randint(1, numTeach+1))]

然后,我希望能够获取教师列表中教师类的所有实例(随机数小于或等于numTeach)的分数属性的平均值(同样,理想情况下没有列表理解)。我现在已经准备好了:

np.mean([Teacher.score for Teacher in teacher_list])

但是,有没有更好的方法来实现同样的结果而不使用列表理解

在回顾之后,我所使用的围绕列表理解的方法似乎是实现我所追求的结果的最清晰、最简洁的方法


Tags: of方法self列表属性defnpcounter
2条回答

我认为,对于你问题的第一部分,你要寻找的是np.fromfunction

np.fromfunction (lambda x: Teacher (np.random.randint(1,maxScore+1)), (100,)

这将创建一个包含100个元素的数组;每个元素都将填充调用lambda函数的输出,该函数反过来创建一个具有随机值的教师对象

我看不出矢量化或广播在这里有什么帮助

虽然不清楚为什么要避免列表理解或显式循环,但可以通过一个内部循环的内置项来实现,例如map。这回答了您的问题,但请注意,这不是一个好的做法,因为它会破坏可读性

所以

teacher_list = [Teacher(np.random.randint(1,maxScore+1)) for i in range(np.random.randint(1, numTeach+1))]

变成

teacher_list = list(map(lambda i: Teacher(np.random.randint(1,maxScore+1)), range(np.random.randint(1, numTeach+1))))

至于第二个问题,np.mean需要一个数组(或常规Python列表),这意味着您可以再次执行map技巧:

np.mean(list(map(lambda t: t.score, teacher_list)))

相关问题 更多 >

    热门问题