存储类实例的Python列表?

2024-05-20 02:30:28 发布

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

给定一个python类class Student():和一个列表names = [];然后我想创建几个Student()实例并将它们添加到列表names

names = [] # For storing the student instances
class Student():
    def __init__(self, score, gender):
        self.score = score
        self.gender = gender

现在我想看看所有男生的成绩,我能这样做吗?

scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)

我的问题是:如何创建一个可以(如果可以通过任何语句)存储Student实例的列表?或者更确切地说,当我编写names = []时,我如何声明names中的每个元素都是Student的实例,以便我可以使用该元素的属性,尽管python是弱类型的?我希望我说清楚了;)

我可以这样写吗:

    for i in range(len(names)):
        student = Student()
        student = names[i]
        if student.gender == "Male":
            # Whatever

我想不是。。。


Tags: 实例inself元素列表forifnames
3条回答

你试过上面的代码了吗?它应该工作得很好。你可以把它浓缩成:

scores = [ student.name for student in names if student.gender == "Male" ]

请注意,调用列表names是一种误导,因为它是Student实例的列表。

不能将列表定义为学生实例列表;这不是Python的工作方式。

你是在问如何创建你称之为names的列表吗?

names = [ ]
for ( score, gender ) in <some-data-source>:
    names.append( Student( score, gender ) )

当然相当于

names = [ Student( score, gender ) for score, gender in <some-data-source> ]

然后反过来

names = [ Student( *row ) for row in <some-data-source> ]

如果需要对每一行进行大量处理,那么可以将处理移到单独的函数中,或者使用for循环。

def process_row( row ):
    ...
    return score, gender

names = [ Student( *process_row( row ) ) for row in <some-data-source> ]

响应您的编辑,我认为您正试图在Python中声明变量的类型。你写道:

for i in range(len(names)):
    student = Student()
    student = names[i]
    if student.gender == "Male":
        # Whatever

student = Student()行的目的是什么——您试图声明变量的类型student?别那么做。以下将按您的意愿进行:

for student in students:
   if student.gender == "Male":
       # Whatever

注意以下几点:

  1. 我们不需要遍历range(n),然后在names中查找每个实例;遍历容器的每个元素是for循环的目的。
  2. 您不需要对什么是student做任何声明——它可以是字符串、布尔值、列表、aStudent等等。这是动态类型。同样,students不必是一个列表;您可以在任何iterable上迭代。
  3. 当您编写student.gender时,Python将获得genderstudent属性,或者在没有异常的情况下引发异常。

我对OOP还不太熟悉,但这难道不能很好地满足您的要求吗?name_list是一个类变量,每次您创建一个新的Student对象时,它都会被添加到Student.name_list。比如说,你有一个方法cheat(self),你想在第三个学生身上执行,你可以运行Student.name_list[2].cheat()。代码:

class Student():
    name_list = []
    def __init__(self, score, gender):
        Student.name_list.append(self)
        self.score = score
        self.gender = gender

    #this is just for output formatting
    def __str__(self):
        return "Score: {} || Gender: {}".format(self.score, self.gender)

#again for output formatting
def update(): print([str(student) for student in Student.name_list])

update()
Student(42, "female")
update()
Student(23, "male")
update()
Student(63, "male")
Student(763, "female")
Student("over 9000", "neutral")
update()

输出:

[]
['Score: 42 || Gender: female']
['Score: 42 || Gender: female', 'Score: 23 || Gender: male']
['Score: 42 || Gender: female', 'Score: 23 || Gender: male', 'Score: 63 || Gender: male', 'Score: 763 || Gender: female', 'Score: over 9000 || Gender: neutral']

首先python是而不是弱类型的。但是它是动态类型的,因此不能为列表指定元素类型。

但是,这不会阻止您访问对象的属性。这很管用:

names = [Student(1,"Male"), Student(2,"Female")]
scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)

然而,使用列表理解来写这篇文章更像是一种Python:

names = [Student(1,"Male"), Student(2,"Female")]
scores = [i.score for i in names if i.gender == "Male"]

相关问题 更多 >