-8

私はPythonでcsvファイルを書いていますが、ネストされたオブジェクトには4つのレベルがあります。お気に入り

このように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 ループに行がない場合、システムが機能する方法はありますか?

4

3 に答える 3

4

サブジェクトがない場合、または書籍の場合と同様に、s.subjectsisNoneまたはその他の値を想定する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.subjectsあります。subject.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 に答える