用于存储类实例的Python列表?

时间:2010-08-14 15:37:26

标签: python list

给出一个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

我猜不是......

3 个答案:

答案 0 :(得分:14)

您是否尝试过以上代码?它应该工作正常。您可以将其浓缩为:

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

请注意,调用列表names会产生误导,因为它是Student个实例的列表。

您无法将列表定义为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是什么声明 - 它可以是字符串,布尔值,列表,Student,等等。这是动态类型。同样,students不一定是列表;你可以迭代任何 iterable
  3. 当您编写student.gender时,Python将获得gender的{​​{1}}属性,如果没有,则会引发异常。

答案 1 :(得分:5)

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

但是,这并不妨碍您访问对象的属性。这很好用:

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

然而,使用列表理解来写这个更加pythonic:

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

答案 2 :(得分:3)

我对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']