如何在Python中实现高效的for循环?

时间:2013-04-26 06:55:25

标签: python loops

我在python中编写csv文件,有四层嵌套对象。像

我需要像这样显示csv

StudentNameStudentClass SubjectNameSubjectDate SubjectBookNAmeSubjectBookpage

我正在使用循环

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循环中没有行,则系统可以正常工作

3 个答案:

答案 0 :(得分: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>表达任何有意义的表达

答案 1 :(得分:0)

您应该使用空列表初始化s.subjectssubject.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 ]