给定一个 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
注意几件事:
- 我们不需要遍历
range(n)
然后在names
中查找每个实例;遍历容器的每个元素是for
循环的目的。 - 您不需要对
student
是什么做任何声明——它可以是字符串、 bool 值、列表、Student
等等。这就是动态类型。同样,students
不必是一个列表;您可以迭代任何可迭代。 - 当你写
student.gender
时,Python会获取student
的gender
属性,如果没有则抛出异常一。
关于用于存储类实例的 Python 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484019/