您尝试过上面的代码吗?它应该工作正常。您可以将其压缩为:
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
loop.
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
;迭代容器的每个元素是 a 的目的for
loop.
- 您无需对什么做出任何声明
student
is——它可以是一个字符串、一个布尔值、一个列表、一个Student
, 任何。这是动态类型。同样地,students
不一定是一个列表;你可以迭代任何iterable.
- 当你写的时候
student.gender
,Python 将得到gender
的属性student
,或者如果没有则引发异常。