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

lad*_*afa 15 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
Run Code Online (Sandbox Code Playgroud)

现在我想查看所有男学生的分数,我可以这样做吗?

scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何创建一个列表,可以(如果可以通过任何语句完成)存储实例Student?或者更确切地说,当我写作时,我names = []怎么能说出每个元素names都是一个实例,Student这样我可以使用这个元素的attributs,尽管python是弱类型的?我希望我明白了;)

我可以这样写:

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

我猜不会...

Kat*_*iel 14

你上面的代码了吗?它应该工作正常.你可以将它压缩成:

scores = [ student.name for student in names if student.gender == "Male" ]
Run Code Online (Sandbox Code Playgroud)

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

您无法将列表定义为Student实例列表; 这不是Python的工作方式.

您是否在询问如何创建您调用的列表names

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

这当然相当于

names = [ Student( score, gender ) for score, gender in <some-data-source> ]
Run Code Online (Sandbox Code Playgroud)

反过来

names = [ Student( *row ) for row in <some-data-source> ]
Run Code Online (Sandbox Code Playgroud)

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

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

names = [ Student( *process_row( row ) ) for row in <some-data-source> ]
Run Code Online (Sandbox Code Playgroud)

回应你的编辑,我想你正试图在Python中声明变量的类型.你写了:

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

该行的目的是什么student = Student()- 您是否尝试声明变量的类型student?不要那样做.以下将按您的意图执行:

for student in students:
   if student.gender == "Male":
       # Whatever
Run Code Online (Sandbox Code Playgroud)

注意几件事:

  1. 我们不需要迭代range(n),然后查找每个实例names; 迭代容器的每个元素是for循环的目的.
  2. 你不需要对什么做任何声明student- 它可以是字符串,布尔值,列表Student,等等.这是动态类型.同样,students不必是一个清单; 你可以迭代任何迭代.
  3. 在编写时student.gender,Python将获取gender属性student,或者如果没有异常则引发异常.


Jak*_*evi 6

我对 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()
Run Code Online (Sandbox Code Playgroud)

输出:

[]
['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']
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 5

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

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

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

然而,使用列表理解来编写它更加pythonic:

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

  • 弱号类型意味着类型之间没有太大差异.因此,您可以将字符串变量添加到数字中,就像它也是一个数字一样.在python中你必须知道变量类型.但它只能在运行时或动态地找到. (4认同)