Daten umformen und verbinden · Übung
Verbinde Sequenzen mit zip()
enumerate() verbindet jeden Wert mit einer von Python erzeugten Position. Manchmal stehen die benötigten Werte bereits in zwei getrennten Sequenzen.
Zum Beispiel kann ein Quiz Fragetexte und eingegebene Antworten in zusammenpassenden Listen speichern:
Die vorige Lektion hat enumerate() eingeführt. Hier liefert es jeden Fragetext zusammen mit seinem Index. Dieser Index liest dann die eingegebene Antwort an der passenden Position.
Das funktioniert, aber die Schleife verwaltet weiterhin eine Zahl und verwendet sie, um in die zweite Liste zu schauen. Der eigentliche Zusammenhang ist einfacher: Der erste Fragetext gehört zur ersten eingegebenen Antwort, der zweite zur zweiten und so weiter.
Pythons zip() drückt diesen Zusammenhang direkt aus:
zip erzeugt Paare. Die Schleife entpackt jedes Paar in prompt und response.
Schütze vor unbemerktem Abschneiden
zip stoppt, wenn die kürzeste Eingabe endet:
list(zip(["A", "B"], [1]))
list(...) sammelt die von zip erzeugten Paare in einer Liste, damit du sie untersuchen kannst. Das ergibt nur [("A", 1)]. Das unzugeordnete "B" wird nicht gemeldet.
Manchmal ist das Abschneiden beabsichtigt. In einem Quizprogramm bedeutet es meist, dass Daten verloren gegangen sind. Prüfe daher vor dem Verbinden die Längen. Wie in Python-Grundlagen I stoppt raise die Funktion, wenn ihre Eingabe eine Regel verletzt. Hier verhindert es, dass zip unzugeordnete Daten stillschweigend verwirft:
if len(prompts) != len(responses):
raise ValueError("prompts and responses must have equal length")
Verwende dann zip für die zusammengehörigen Werte.
Was gibt dieser Code aus?
print(list(zip(["A", "B", "C"], [1, 2])))Erstelle Datensätze für Versuche
Verbinde gleich lange Listen mit Fragetexten und eingegebenen Antworten zu einer neuen Liste von Dictionarys. Lehne unterschiedliche Längen ab, statt Daten unbemerkt wegzulassen.
Aufgabe
Vervollständige pair_attempts.
Löse einen
ValueErroraus, wenn die beiden Listen unterschiedlich lang sind.Durchlaufe
zip(prompt_list, response_list)in einer Schleife.Hänge für jedes Paar
{"prompt": prompt, "response": response}an.Gib die neue Liste zurück.
Verändere keine der beiden Eingabelisten.