Gegevens bewerken en combineren · oefening
Combineer reeksen met zip()
enumerate() koppelt elke waarde aan een positie die Python maakt. Soms staan de waarden die we nodig hebben al in twee afzonderlijke reeksen.
Een quiz kan vraagteksten en ingevoerde antwoorden bijvoorbeeld in bij elkaar horende lijsten bewaren:
De vorige les introduceerde enumerate(). Hier levert die functie elke vraagtekst samen met de index. Die index leest vervolgens het ingevoerde antwoord op de bijbehorende positie.
Dit werkt, maar de lus beheert nog steeds een getal en gebruikt dat om in de tweede lijst te kijken. Het echte verband is eenvoudiger: de eerste vraagtekst hoort bij het eerste antwoord, de tweede bij het tweede, enzovoort.
De functie zip() van Python drukt dat verband direct uit:
zip levert paren. De lus pakt elk paar uit in prompt en response.
Bescherm tegen ongemerkt afkappen
zip stopt wanneer de kortste invoer eindigt:
list(zip(["A", "B"], [1]))
list(...) verzamelt de paren die zip levert in een lijst, zodat je ze kunt bekijken. Dit levert alleen [("A", 1)] op. De niet-gekoppelde "B" wordt niet gemeld.
Soms is afkappen de bedoeling. In een quizprogramma betekent het meestal dat er gegevens verloren gingen, dus controleer de lengtes vóór het combineren. Net als in Python-basis I stopt raise de functie wanneer de invoer een regel schendt. Hier voorkomt dat dat zip ongemerkt niet-gekoppelde gegevens weggooit:
if len(prompts) != len(responses):
raise ValueError("prompts and responses must have equal length")
Gebruik daarna zip voor de bij elkaar horende waarden.
Wat drukt dit af?
print(list(zip(["A", "B", "C"], [1, 2])))Bouw pogingrecords
Combineer even lange lijsten met vraagteksten en ingevoerde antwoorden tot een nieuwe lijst met dictionaries. Wijs verschillende lengtes af in plaats van ongemerkt gegevens weg te laten.
Opdracht
Maak pair_attempts af.
Werp een
ValueErrorop wanneer de twee lijsten verschillende lengtes hebben.Doorloop
zip(prompt_list, response_list).Voeg voor elk paar
{"prompt": prompt, "response": response}toe.Geef de nieuwe lijst terug.
Verander geen van beide invoerlijsten.