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

标签 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

我猜不是...

最佳答案

你试过上面的代码了吗?它应该工作正常。您可以将其浓缩为:

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 是什么做任何声明——它可以是字符串、 bool 值、列表、Student 等等。这就是动态类型。同样,students 不必是一个列表;您可以迭代任何可迭代
  3. 当你写student.gender时,Python会获取studentgender属性,如果没有则抛出异常一。

关于用于存储类实例的 Python 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484019/

相关文章:

java - 如何将 HashMap 与 List<Number> 一起使用

Python:检查坐标是否在圆内

python - 为两个模型创建 View

python - 使用 PyODBC、Python 连接到 SQLite3 服务器

c++ - std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?

python - 列表列表更改意外地反射(reflect)在子列表中

arrays - Raku 列表添加运算符 `Z+` 'fails' 除非强制列表之一

python - 检查数据系列列中的 float 是否在另一列中的另一个 float 的 0.200 范围内

python - 从 Pandas Dataframe 创建 txt 文件

list - 如何从 CLIPS 的列表中找到最大元素?