我在python中编写csv文件,有四层嵌套对象。像
我需要像这样显示csv
StudentName
,StudentClass
SubjectName
,SubjectDate
SubjectBookNAme
,SubjectBookpage
我正在使用循环
Just example not actual code
for s in students:
for subject in s.subjects:
for book in subject.books :
writer.writerow(s.name, s.class, subject.name, book.name)
如果我有所有子对象,这可以正常工作。
但是当我没有书籍或科目时,循环不起作用。
我不想使用很多if else
是否有任何方法可以有效地编写这些循环,如果for循环中没有行,则系统可以正常工作
答案 0 :(得分:4)
当没有主题时,假设s.subjects
为None
或其他False
值,同样适用于书籍
for s in students:
for subject in s.subjects or []:
for book in subject.books or []:
writer.writerow(s.name, s.class, subject.name, book.name)
更一般地说,你可以写
for s in students:
for subject in s.subjects if <condition> else []:
for book in subject.books if <condition> else []:
writer.writerow(s.name, s.class, subject.name, book.name)
<condition>
表达任何有意义的表达
答案 1 :(得分:0)
您应该使用空列表初始化s.subjects
和subject.books
。这样,当您尝试在此处或代码中的其他位置迭代它们时,您将不会收到错误。
答案 2 :(得分:0)
使用[]初始化student.subjects和subject.books,然后它就可以了。正如@ user714965所说的那样。
或者,使用list-comprehension:
for s in [stu if stu.has_key(subjects) for stu in students]:
for subject in [subj if subj.has_key(books) for subj in s.subjects]:
lists= [(s.name, s.class, subject.name, book.name) for book in subject.books]
print r'\n'.join(r','join(lists))
或
如果您的循环不是很深,请尝试以下方法:
fn= s.has_key('subjects') and (lambda s: /do sth. with s/ ) or (lambda s: /do sth. else with s/)
在你的循环中,使用像这样的fn
,
[fn(s) for s in students ]