-8

我正在用 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 循环中没有行,那么系统可以工作

4

3 回答 3

4

没有主题时假设s.subjectsNone或其他值,对于书籍也是如此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>任何表达都有意义的地方在哪里

于 2013-04-26T06:59:28.480 回答
0

您应该初始化s.subjectssubject.books使用空列表。这样,当您尝试在此处或代码中的其他位置迭代它们时,您就不会遇到错误。

于 2013-04-26T06:56:59.633 回答
0

用 [] 初始化你的 student.subjects 和 subject.books,然后它就可以工作了。正如@user714965 所说。

或者,使用列表理解:

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 ]
于 2013-04-26T08:17:12.683 回答