Wie kann ich in Python die Effizienz für die Schleife machen?

Ich schreibe die csv-Datei in Python und es gibt vier Ebenen von verschachtelten Objekten. mögen

Ich muss das csv so zeigen

StudentName , StudentClass SubjectName , SubjectDate SubjectBookNAme , SubjectBookpage

Ich benutze Loop wie

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) 

Das funktioniert gut, wenn ich alle untergeordneten Objekte habe.

Aber wenn ich keine Bücher oder Themen habe, dann läuft die Schleife nicht.

Ich möchte nicht viele verwenden, if else gibt es irgendeine Möglichkeit, diese Loops effizient zu schreiben, wenn es keine Zeilen in für Schleife dann System funktioniert

3 Solutions collect form web for “Wie kann ich in Python die Effizienz für die Schleife machen?”

Angenommen, s.subjects ist None oder ein anderer False Wert, wenn es keine Themen gibt, und ebenso für Bücher

 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) 

Im Allgemeinen können Sie schreiben

 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) 

Wo ist <condition> was Ausdruck ist sinnvoll

Sie sollten s.subjects und subject.books mit leeren Listen initialisieren. Auf diese Weise bekommst du keinen Fehler, wenn du versuchst, sie hier oder an anderen Orten in deinem Code zu iterieren.

Initialisieren Sie Ihre student.subjects und subject.books mit [], und dann wird es funktionieren. Genau wie das, was @ user714965 sagte.

Oder verwenden Sie das Listenverständnis:

 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)) 

oder

Wenn deine Schleife nicht sehr tief ist, versuch etwas so:

 fn= s.has_key('subjects') and (lambda s: /do sth. with s/ ) or (lambda s: /do sth. else with s/) 

In deiner Schleife, benutze das fn so,

 [fn(s) for s in students ] 
  • Wie korrigiere ich dies für Loop-Over-Tupel-Funktion in Python?
  • Zuordnen Sie die Variable auf den ursprünglichen Wert (definiert vor der Schleife) am Anfang jeder Iteration in der Schleife
  • Pythonäquivalent von C ++ begin () und end () für benutzerdefinierte Klassen
  • Warum funktioniert das bei der Schleife nicht?
  • Schleifenzeichen A / B abwechselnd
  • Ändern von etwas von Iteration über ein numpy Array zu Vektorisierung
  • Python: Wenn ein Eintrag kein akzeptabler Parameter für eine Aufforderung ist, wie man neu fragt
  • Erstellen Sie neue Token und Tupel aus bestehenden, basierend auf Bedingungen
  • Python-Looping und Programm neu starten, wenn true
  • Python - Vorherige und nächste Werte innerhalb einer Schleife
  • Zählen (und Schreiben) von Wortfrequenzen für jede Zeile innerhalb der Textdatei
  • Python ist die beste Programmiersprache der Welt.