- Leren
- Informatica & ICT
- Programmeren
- Inleiding tot programmeren met Python
- Dictionary’s en verzamelingen in Python
Python-dictionary’s en verzamelingen
BeginnerLes 7 van 10 in Cursus Inleiding tot programmeren met Python
Wat je leert
- Leg uit wat een dictionary is, maak er een van sleutel-waardeparen, lees waarden via hun sleutel zonder vast te lopen op ontbrekende sleutels en voeg sleutel-waardeparen toe, wijzig ze en verwijder ze.
- Maak dictionary’s van sleutel-waardeparenBeschrijf een dictionary als een collectie die unieke sleutels aan waarden koppelt, schrijf dictionaryliterals, maak dictionary’s met
dict()en kies sleutels die Python accepteert. - Zoek waarden veilig op via hun sleutelLees een waarde met vierkante haakjes, controleer met
inof een sleutel bestaat en gebruikget()om een standaardwaarde te geven in plaats van te stoppen bij een ontbrekende sleutel. - Voeg sleutel-waardeparen toe, wijzig ze en verwijder zeVoeg nieuwe elementen toe, werk bestaande waarden bij, voeg twee dictionary’s samen en verwijder sleutel-waardeparen met
del,pop()en verwante methoden.
- Maak dictionary’s van sleutel-waardeparen
- Doorloop elke sleutel, waarde of elk sleutel-waardepaar van een dictionary, bereken totalen, maak gesorteerde rapporten en maak nieuwe dictionary’s met lussen en dictionarycomprehensies.
- Doorloop sleutels, waarden en sleutel-waardeparen met een lusGebruik
for-lussen met een dictionary,.values()en.items(), sorteer sleutels op naam of waarde en voorkom dat je de omvang van een dictionary wijzigt terwijl je die met een lus doorloopt. - Maak nieuwe dictionary’s van bestaande gegevensMaak dictionary’s met lussen en dictionarycomprehensies om waarden te transformeren, elementen te filteren, lijsten te koppelen en sleutels en waarden om te wisselen.
- Doorloop sleutels, waarden en sleutel-waardeparen met een lus
- Gebruik een dictionary als verzameling tellers, verzamel elementen in groepen en tel waarden per categorie op: alledaagse taken die dictionary’s in echte programma’s uitvoeren.
- Tel hoe vaak waarden voorkomenMaak een frequentietabel met een dictionary van tellers, tel woorden in een tekst, vind de meest voorkomende elementen en herken
Counterals een verkorte aanpak. - Groepeer elementen en tel waarden op per categorieVerzamel elementen in lijsten onder een gedeelde sleutel, tel bedragen per categorie op, bereken groepsgemiddelden en voorkom dat lijsten onbedoeld tussen sleutels worden gedeeld.
- Tel hoe vaak waarden voorkomen
- Geef records weer als dictionary’s binnen dictionary’s of lijsten, lees waarden op elk niveau en werk ze bij, en doorloop geneste gegevens met lussen om ze samen te vatten.
- Sla records op in geneste dictionary’s en benader zeMaak dictionary’s van dictionary’s, lijsten van dictionary’s en dictionary’s van lijsten, bereik waarden door aaneengeschakeld opzoeken, werk ze bij en kopieer geneste gegevens veilig.
- Doorloop geneste gegevens met lussen en vat ze samenGebruik lussen, waaronder geneste lussen, om over records te rapporteren, ze te filteren en samen te vatten, en handel records met ontbrekende velden of lege lijsten af.
- Sla records op in geneste dictionary’s en benader ze
- Maak verzamelingen van unieke waarden, toets lidmaatschap, vergelijk collecties met vereniging, doorsnede en verschil en kies tussen lijsten, tuples, dictionary’s en verzamelingen.
- Maak verzamelingen en verwijder duplicatenSchrijf en wijzig verzamelingen, leg uit waarom ze geen duplicaten en geen volgorde hebben, toets lidmaatschap en verwijder duplicaten uit een lijst met of zonder behoud van de volgorde.
- Vergelijk collecties met verzamelingsbewerkingenGebruik vereniging, doorsnede, verschil en symmetrisch verschil, toets deelverzamelingen, bovenverzamelingen en disjuncte verzamelingen en maak onderscheid tussen operatoren die nieuwe verzamelingen teruggeven en methoden die een verzameling wijzigen.
- Kies de juiste collectie voor een taakVergelijk lijsten, tuples, dictionary’s en verzamelingen, kies welke een taak nodig heeft en combineer ze, ook met verzamelingsbewerkingen op dictionarysleutels.
- Maak verzamelingen en verwijder duplicaten
Dictionary’s en verzamelingen in Python: uitleg
1Sla gegevens op en zoek ze op met dictionary’s
Een dictionary koppelt elke sleutel aan een waarde, zodat je contacten, voorraad en andere records handig op naam kunt opzoeken. Om een dictionary te maken en te wijzigen, moet je eerst weten wat een sleutel aanduidt en wat de bijbehorende waarde betekent. Door veilig op te zoeken kan een programma vervolgens onderscheid maken tussen een ontbrekend record en een bestaande waarde nul. Door paren toe te voegen, samen te voegen en te verwijderen, wijzig je de opgeslagen informatie volgens voorspelbare regels voor de invoegvolgorde.
1.1 Maak dictionary’s van sleutel-waardeparen
Een dictionary slaat paren op: een sleutel duidt een element aan en de bijbehorende waarde bevat de informatie die je zoekt. Een contactenlijst is een bruikbaar model: een naam leidt naar een telefoonnummer. Bij het opzoeken in een dictionary gebruik je een sleutel, ook als die sleutel toevallig een getal is.
Schrijf de paren
ages = {"Ana": 31, "Ben": 27, "Cara": 35}
print(ages["Ben"])
print(len(ages))
Dit drukt 27 en daarna 3 af. De dubbele punt koppelt elke sleutel aan zijn waarde; komma’s scheiden de paren. len telt paren. Zowel {} als dict() maakt een lege dictionary.
Elke sleutel komt maar één keer voor. In {"a": 1, "b": 2, "a": 3} vervangt de latere waarde voor "a" de eerdere, zodat {'a': 3, 'b': 2} overblijft. Twee verschillende sleutels mogen dezelfde waarde hebben: {"Ana": "blue", "Ben": "blue"} heeft nog steeds twee elementen.
Maak een dictionary van andere gegevens
Kies de vorm die bij de invoer past:
colors = dict(red=1, blue=2)
coordinates = dict([("x", 10), ("y", 20)])
labels = dict(zip(["a", "b", "c"], [1, 2, 3]))
De eerste vorm maakt stringsleutels van de argumentnamen. De tweede leest een sequentie van paren met twee elementen. De derde koppelt overeenkomstige elementen van twee lijsten en levert {'a': 1, 'b': 2, 'c': 3} op. De strings in de eerste vorm zijn 'red' en 'blue', geen opgezochte variabelen.
Kies bruikbare sleutels
Dictionarysleutels moeten hashbaar zijn. Strings en getallen werken, net als tuples die volledig uit hashbare elementen bestaan. Lijsten, dictionary’s en gewone verzamelingen werken niet als sleutel. Gebruik voor een locatie de tuple (2, 3) in plaats van de lijst [2, 3]:
board = {(0, 0): "start", (2, 3): "treasure"}
print(board[(2, 3)])
Dit drukt treasure af. De ronde haakjes maken van het coördinatenpaar één sleutel. Een tuple met een lijst voldoet nog steeds niet aan de regel voor hashbaarheid. Voor dictionarywaarden geldt die beperking niet: een waarde kan een lijst, een andere dictionary of een ander type zijn.
Gelijke numerieke sleutels verwijzen naar hetzelfde sleutel-waardepaar. Omdat 1, 1.0 en True bij vergelijking gelijk zijn, bevat {1: "one", 1.0: "float one"} één paar, met de waarde 'float one'. De string "1" is een andere sleutel dan het getal 1.
Houd volgorde en identiteit uit elkaar
Sinds Python 3.7 bewaren dictionary’s de invoegvolgorde. De leeftijden hierboven verschijnen als Ana, Ben, Cara wanneer je ze afdrukt of met een lus doorloopt. Het blijven sleutels, geen lijstposities: ages[0] vraagt om de sleutel 0 en werpt KeyError: 0 op.
Dictionary’s zijn wijzigbaar. Na backup = ages verwijzen beide namen naar dezelfde dictionary. Als je backup["Ana"] = 32 instelt, verandert ook de waarde die je via ages bereikt. Schrijf backup = ages.copy() of backup = dict(ages) om de buitenste dictionary te kopiëren. Afzonderlijke buitenste dictionary’s kunnen nog steeds geneste lijsten en dictionary’s delen.
Belangrijkste punten
- Elke unieke sleutel is gekoppeld aan één waarde;
len(d)telt de paren. - Sleutels moeten hashbaar zijn; waarden kunnen van elk type zijn.
- Gelijke sleutels delen één sleutel-waardepaar en latere toekenningen vervangen de waarde ervan.
- Invoegvolgorde maakt van dictionarysleutels geen posities.
- Een toekenning deelt een dictionary;
copy()maakt een afzonderlijke buitenste dictionary.
1.2 Zoek waarden veilig op via hun sleutel
De manier van opzoeken moet passen bij wat een ontbrekende sleutel in je programma betekent. Soms wijst die op een fout. Soms is het normaal, zoals bij een product dat nog niet is geteld. Python biedt afzonderlijke manieren om die gevallen af te handelen.
Lees een bestaande waarde
stock = {"apples": 12, "pears": 0, "plums": 7}
print(stock["plums"])
Het opzoeken met vierkante haakjes geeft 7 terug. Sleutels moeten exact overeenkomen: "Plums" verschilt van "plums". Het lezen van stock["kiwis"] werpt KeyError: 'kiwis' op, omdat die sleutel ontbreekt. Je krijgt geen lege waarde of een telling van nul.
Gebruik deze directe zoekmethode als een sleutel verplicht is. Een fout vestigt dan de aandacht op onvolledige gegevens of een spelfout op de plaats waar die voorkomt.
Controleer op een sleutel
De expressie key in stock controleert of een sleutel bestaat. "pears" in stock is True, hoewel de opgeslagen waarde nul is. "kiwis" not in stock is ook True.
item = "kiwis"
if item in stock:
print(stock[item])
else:
print("No stock record for", item)
Hier leidt de ontbrekende sleutel tot een melding. Het opzoeken gebeurt alleen in de tak waarin de sleutel bestaat.
Een lidmaatschapscontrole op een dictionary doorzoekt sleutels. 12 in stock is False; om te vragen of een element de opgeslagen waarde 12 heeft, schrijf je 12 in stock.values(). De collectie die je na in zet, bepaalt wat wordt doorzocht.
Lees met een standaardwaarde
stock.get("kiwis") geeft None terug zonder KeyError op te werpen. Geef een tweede argument om een andere standaardwaarde te kiezen: stock.get("kiwis", 0) geeft 0 terug. Geen van beide aanroepen voegt een nieuw element toe. Na beide aanroepen bevat de dictionary nog steeds alleen appels, peren en pruimen.
| Vraag die het programma stelt | Bruikbare vorm |
|---|---|
| Wat is de waarde voor deze verplichte sleutel? | stock[item] |
| Bestaat deze sleutel? | item in stock |
| Wat is de waarde, of een vervangende waarde als die ontbreekt? | stock.get(item, 0) |
De standaardwaarde vervangt een ontbrekend zoekresultaat, niet een opgeslagen waarde. stock.get("pears", 99) geeft 0 terug, omdat peren al een waarde heeft.
Verwar nul niet met ontbreken
if stock.get("pears"): controleert de waarheidswaarde van de teruggegeven waarde. Nul is onwaar, dus wordt die tak overgeslagen. Dezelfde toets slaat ook een ontbrekende sleutel over waarvan het opzoeken None teruggeeft. Controleer rechtstreeks of de sleutel aanwezig is om die gevallen te onderscheiden.
Verwerk een hele bestelling
prices = {"coffee": 3.5, "tea": 2.75}
order = ["tea", "coffee", "tea", "soda"]
total = 0
for item in order:
if item in prices:
total += prices[item]
else:
print("No price for", item)
print(total)
De eerste thee brengt het totaal op 2,75, koffie brengt het op 6,25 en de tweede thee brengt het op 9,0. Frisdrank levert de melding No price for soda op en voegt niets toe. Bij elke doorgang direct opzoeken zou bij frisdrank mislukken; zonder melding een standaardprijs van nul gebruiken zou de ontbrekende prijs verbergen. De afzonderlijke tak maakt die ontbrekende informatie zichtbaar.
Belangrijkste punten
d[key]werptKeyErrorop als de sleutel ontbreekt.incontroleert sleutels, ook sleutels waarvan de waarde nul of leeg is.getgeeft een waarde of een standaardwaarde terug zonder een sleutel toe te voegen.- Kies alleen een standaardwaarde als die zinvol is voor de taak.
1.3 Voeg sleutel-waardeparen toe, wijzig ze en verwijder ze
Bij het bijwerken van dictionary’s geven sleutels aan wat verandert. Een waarde toekennen kan een nieuw paar toevoegen of een oude waarde vervangen. Het verwijderen van een paar kan ook informatie teruggeven die je nodig hebt, zoals de hoeveelheid die uit een voorraad is verwijderd.
Voeg toe en vervang
scores = {"Ana": 8}
scores["Ben"] = 6
scores["Ana"] = 9
scores["Ben"] += 2
print(scores)
Het resultaat is {'Ana': 9, 'Ben': 8}. Ben wordt toegevoegd, Ana wordt bijgewerkt en daarna stijgt Bens bestaande score. De regel met += leest eerst de oude waarde en werpt dus KeyError op bij een ontbrekende sleutel. Dictionary’s hebben geen methode append.
Combineer dictionary’s
update kopieert paren naar een bestaande dictionary. Bij die scores verandert scores.update({"Ben": 7, "Cara": 10}) Bens score in 7 en voegt het Cara toe met 10.
Sinds Python 3.9 kan de samenvoegoperator een nieuwe dictionary maken:
left = {"x": 1, "y": 2}
right = {"y": 5, "z": 3}
merged = left | right
print(merged)
Dit drukt {'x': 1, 'y': 5, 'z': 3} af. Bij een gedeelde sleutel geldt de rechterwaarde. left blijft ongewijzigd; left |= right zou die ter plaatse bijwerken.
update() geeft None terug. Als je scores = scores.update(new_scores) schrijft, wordt de oude dictionary gewijzigd en verwijst scores daarna naar None. Roep update op een eigen regel aan. Ken het resultaat van left | right toe als je een nieuwe samengevoegde dictionary wilt.
Verwijder paren
| Bewerking | Effect en retourwaarde |
|---|---|
del d[key] | Verwijdert het paar; een ontbrekende sleutel werpt KeyError op. |
d.pop(key) | Verwijdert het paar en geeft de waarde terug; een ontbrekende sleutel werpt KeyError op. |
d.pop(key, 0) | Geeft 0 terug als de sleutel ontbreekt. |
d.popitem() | Verwijdert het laatst ingevoegde paar en geeft het als tuple terug. |
d.clear() | Verwijdert alle paren en geeft None terug. |
Voor {"a": 1, "b": 2, "c": 3} geeft popitem() de tuple ('c', 3) terug. Dit gebruikt de invoegvolgorde, niet de alfabetische volgorde of de grootste waarde.
Volg een voorraadwijziging
inventory = {"pens": 10, "pads": 4}
inventory["pens"] -= 3
inventory["clips"] = 50
removed = inventory.pop("pads")
Na de verkoop blijven 7 pennen over. Door paperclips toe te voegen ontstaat een nieuwe sleutel. Het verwijderen van schrijfblokken slaat 4 op in removed, waarna {'pens': 7, 'clips': 50} overblijft. Dankzij de retourwaarde van pop kan het programma de verwijderde hoeveelheid gebruiken nadat het paar is verdwenen.
Voeg alleen toe als de sleutel ontbreekt
setdefault(key, default) geeft de bestaande waarde terug, of voegt de standaardwaarde toe en geeft die terug als de sleutel ontbreekt. Voor stock = {"apples": 12, "pears": 0, "plums": 7} voegt stock.setdefault("kiwis", 0) kiwi’s toe en geeft 0 terug. stock.setdefault("apples", 99) geeft 12 terug en laat appels ongewijzigd. Dit toevoegen is het verschil met get.
Als je een bestaande sleutel bijwerkt, blijft die op dezelfde plaats. Als je begint met {"a": 1, "b": 2, "c": 3}, blijft "a" vooraan staan wanneer je d["a"] = 10 instelt. Als je "a" verwijdert en opnieuw toevoegt, komt die na "c". Een vervangende waarde en een nieuw ingevoegd paar beïnvloeden de volgorde verschillend.
Belangrijkste punten
d[key] = valuevoegt een sleutel toe of vervangt de bijbehorende waarde.- Bij het samenvoegen van dictionary’s geldt voor een gedeelde sleutel de rechterwaarde.
popgeeft een verwijderde waarde terug;popitemgeeft het laatst ingevoegde paar terug.updateencleargevenNoneterug.setdefaultvoegt alleen een standaardwaarde toe voor een ontbrekende sleutel.- Bijwerken behoudt de plaats van een sleutel; verwijderen en opnieuw invoegen verplaatst die naar het einde.
2Doorloop dictionary’s met lussen en maak nieuwe dictionary’s
Met lussen maak je van een dictionary een rapport, een totaal of de invoer voor een nieuwe collectie. Je kiest eerst wat elke doorgang nodig heeft: een sleutel, een waarde of beide delen van een paar. Sorteren bepaalt de volgorde van een rapport zonder de oorspronkelijke dictionary te veranderen. Een comprehensie kan een korte regel uitdrukken om paren te behouden of te transformeren, terwijl gewone lussen ruimte laten voor meerdere verwerkingsstappen en controles.
2.1 Doorloop sleutels, waarden en sleutel-waardeparen met een lus
Kies een lus die je het deel van elk paar geeft dat je nodig hebt. Een dictionary op zichzelf levert sleutels. De weergaven kunnen waarden of volledige paren leveren, zodat je geen informatie hoeft op te zoeken die de lus je rechtstreeks kan geven.
Doorloop sleutels, waarden of paren
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
for day, temp in temps.items():
print(day, temp)
De temperaturen zijn in graden Fahrenheit. Dit drukt Mon 68, Tue 75 en Wed 71 af op afzonderlijke regels, in invoegvolgorde. Elk element is een tuple met twee elementen die de lus uitpakt in day en temp.
| Invoer van de lus | Wat elke doorgang ontvangt |
|---|---|
temps of temps.keys() | Een dagsleutel |
temps.values() | Een temperatuurwaarde |
temps.items() | Een paar (day, temperature) |
Gebruik bij for day in temps: de expressie temps[day] binnen de lus als je de bijbehorende waarde nodig hebt. Als het programma elke keer beide delen nodig heeft, maakt .items() de taak meestal duidelijker.
Begrijp weergaven
keys(), values() en items() geven weergaven terug, die latere wijzigingen in hun dictionary weerspiegelen. Het zijn geen lijsten en je kunt ze niet op positie indexeren. temps.keys()[0] werpt TypeError op. Zet de weergave om naar een lijst als je een momentopname met posities nodig hebt: list(temps) geeft ['Mon', 'Tue', 'Wed'].
Bereken een totaal of vind een bijbehorende sleutel
sum(temps.values()) geeft 214 terug en delen door len(temps) geeft een gemiddelde van ongeveer 71,33. max(temps.values()) geeft 75 terug. Om te vinden welke dag die waarde heeft, schrijf je max(temps, key=temps.get), dat 'Tue' teruggeeft.
Het argument key= geeft een functie op die voor de vergelijking wordt gebruikt. Python doorloopt hier dagsleutels en roept voor elke sleutel temps.get aan om de temperatuur op te halen. Schrijf de functienaam zonder die aan te roepen: temps.get, niet temps.get(). Als waarden gelijk zijn, geeft max de eerste sleutel terug die het tegenkomt.
Sorteer een rapport
sorted(temps) geeft sleutels in alfabetische volgorde terug. sorted(temps.items()) geeft paren terug die op sleutel zijn gesorteerd. Gebruik sorted(temps, key=temps.get) om dagsleutels op temperatuur te sorteren; dit levert ['Mon', 'Wed', 'Tue'] op. Voeg reverse=True toe voor ['Tue', 'Wed', 'Mon']. Deze aanroepen geven lijsten terug; ze veranderen de volgorde van temps niet.
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
passing = 0
for name, grade in grades.items():
print(f"{name}: {grade}")
if grade >= 75:
passing += 1
Het rapport drukt elke naam met het bijbehorende cijfer af. Ana en Cara halen de drempelwaarde, dus eindigt passing op 2.
Verwijder sleutel-waardeparen zonder het doorlopen te verstoren
Voeg geen sleutels toe en verwijder ze niet terwijl je rechtstreeks over een dictionary itereert. Als de omvang verandert, kan RuntimeError: dictionary changed size during iteration worden opgeworpen. Een bestaande waarde vervangen mag wel.
Om koudere dagen te verwijderen, gebruik je for day in list(temps): en verwijder je temps[day] als de waarde lager is dan 70. De lus doorloopt een afzonderlijke lijst van sleutels, zodat {'Tue': 75, 'Wed': 71} in de dictionary overblijft. Een nieuwe gefilterde dictionary maken is een andere manier om het doorlopen en de wijzigingen gescheiden te houden.
Belangrijkste punten
- Doorloop een dictionary voor sleutels,
.values()voor waarden of.items()voor paren. - Weergaven weerspiegelen wijzigingen; lijsten bieden toegang via posities.
key=d.getvergelijkt opgeslagen waarden terwijl het sleutels teruggeeft of sorteert.- Sorteren geeft een lijst terug en laat de volgorde van de dictionary ongewijzigd.
- Doorloop een gekopieerde sleutellijst wanneer je sleutel-waardeparen verwijdert.
2.2 Maak nieuwe dictionary’s van bestaande gegevens
Een nieuwe dictionary ontstaat vaak uit een regel die op bestaande gegevens wordt toegepast. Begin met een lus die je kunt uitleggen en gebruik daarna een comprehensie als dezelfde regel duidelijk in één expressie past.
Maak één paar tegelijk
words = ["kiwi", "fig", "banana"]
lengths = {}
for word in words:
lengths[word] = len(word)
Elke doorgang kiest een woord als sleutel en de lengte ervan als waarde. Het resultaat is {'kiwi': 4, 'fig': 3, 'banana': 6}. De dictionary wordt vóór de lus aangemaakt, zodat eerdere paren bij latere doorgangen beschikbaar blijven.
Een dictionarycomprehensie drukt hetzelfde werk uit:
lengths = {word: len(word) for word in words}
Lees het for-deel om te zien wat wordt doorlopen en daarna de expressie ervoor om te zien welk paar wordt gemaakt. De dubbele punt scheidt de sleutelexpressie van de waarde-expressie. Zonder die dubbele punt maakt {word for word in words} een verzameling.
Behoud bepaalde elementen
Een if-clausule filtert de invoer:
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
high_grades = {
name: grade
for name, grade in grades.items()
if grade >= 80
}
Ana en Cara voldoen aan de toets, wat {'Ana': 88, 'Cara': 95} geeft. Bens paar wordt weggelaten. De invoerdictionary blijft ongewijzigd; het resultaat bevat alleen paren die aan de voorwaarde voldoen.
Transformeer waarden
Een comprehensie kan de dagen behouden terwijl Fahrenheitmetingen naar Celsius worden omgezet:
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
celsius = {
day: round((f - 32) * 5 / 9, 1)
for day, f in temps.items()
}
Het resultaat is {'Mon': 20.0, 'Tue': 23.9, 'Wed': 21.7}. Voor dinsdag geeft 32 aftrekken 43; vermenigvuldigen met 5 en delen door 9 geeft ongeveer 23,89. round(..., 1) slaat 23,9 op. De sleutel blijft hetzelfde terwijl de waarde verandert.
Koppel lijsten zorgvuldig
dict(zip(names, scores)) koppelt elke naam aan de score op dezelfde positie. zip stopt wanneer de kortste invoer eindigt. Als je ["Ana", "Ben", "Cara"] koppelt aan [90, 85], krijg je {'Ana': 90, 'Ben': 85}. Geen foutmelding wijst op Cara’s ontbrekende score, dus controleer de invoerlengtes als elke naam een score moet hebben.
Wissel sleutels en waarden om
favorites = {"Ana": "blue", "Ben": "red", "Cara": "blue"}
by_color = {color: name for name, color in favorites.items()}
Het resultaat is {'blue': 'Cara', 'red': 'Ben'}. Zowel Ana als Cara zou dezelfde nieuwe sleutel nodig hebben, dus vervangt Cara’s latere paar dat van Ana. Omkeren behoudt alleen alle paren als de oude waarden uniek en hashbaar zijn. Een lijstwaarde kan helemaal geen dictionarysleutel worden. Om meerdere namen onder één kleur te behouden, sla je een lijst van namen onder die kleur op.
Gebruik een gewone lus als de taak meerdere instructies, meldingen of controles nodig heeft. Een comprehensie is nuttig omdat ze een korte regel zichtbaar maakt; als je er een grotere procedure in probeert te persen, wordt de regel moeilijker te volgen.
Belangrijkste punten
- Een dictionarycomprehensie maakt een sleutel-waardepaar voor elk geselecteerd invoerelement.
- Een
if-clausule filtert; de expressies voor het paar kunnen de gegevens transformeren. zipstopt bij de kortste invoer.- Bij het omkeren van een dictionary kunnen sleutel-waardeparen verloren gaan als waarden zich herhalen.
3Tel en groepeer gegevens met dictionary’s
Dictionary’s kunnen resultaten verzamelen terwijl een lus gegevens verwerkt. Een teller slaat één getal per verschillend element op; een groepeerdictionary slaat meerdere leden onder elke categorie op. Beide patronen moeten de eerste keer dat een sleutel voorkomt afhandelen en bewaren wat eerdere doorgangen hebben verzameld. Zodra de groepen bestaan, kun je hun lijsten gebruiken voor totalen en gemiddelden of in rapporten, en kunnen hulpmiddelen uit de standaardbibliotheek de initialisatie verkorten.
3.1 Tel hoe vaak waarden voorkomen
Een frequentietabel geeft aan hoe vaak elk verschillend element voorkomt. De sleutels duiden de elementen aan; de waarden zijn tellers. De dictionary groeit wanneer een nieuw element verschijnt, terwijl latere voorkomens een bestaande telling verhogen.
Volg een teller stap voor stap
counts = {}
for letter in "banana":
if letter in counts:
counts[letter] += 1
else:
counts[letter] = 1
De eerste letter maakt 'b': 1. De volgende maakt 'a': 1 en daarna ontstaat 'n': 1. De volgende "a" verhoogt de bestaande telling tot 2. Na de laatste twee letters is de dictionary {'b': 1, 'a': 3, 'n': 2}. De volgorde geeft aan wanneer elke letter voor het eerst verscheen, niet welke letter het vaakst voorkomt.
Gebruik nul vóór het eerste voorkomen
De twee takken kunnen samen één toekenning worden:
counts = {}
for letter in "banana":
counts[letter] = counts.get(letter, 0) + 1
De rechterkant leest de vorige telling, gebruikt nul als de sleutel ontbreekt en telt er dan één bij op. De linkerkant slaat die nieuwe telling op. get zelf voegt niets toe; de toekenning doet dat.
Als je alleen counts[letter] += 1 gebruikt, mislukt dat bij een nieuwe letter. Als je counts = {} binnen de lus zet, ontstaat een ander probleem: elke doorgang wist de eerdere tellingen. Initialiseer de dictionary één keer voordat je de elementen verwerkt.
Bepaal wat als hetzelfde woord telt
Bij tekst beïnvloeden hoofdletters en leestekens de sleutels. De strings "The" en "the" verschillen, net als "dog." en "dog". Schoon de vormen op voordat je ze als sleutels gebruikt:
text = "The cat saw the dog. The dog ran."
counts = {}
for word in text.lower().split():
word = word.strip(".,!?")
counts[word] = counts.get(word, 0) + 1
Dit levert {'the': 3, 'cat': 1, 'saw': 1, 'dog': 2, 'ran': 1} op. lower verwerkt hoofdletters en kleine letters, split scheidt woorden bij witruimte en strip verwijdert de vermelde leestekens aan de uiteinden. Het verwijdert geen leestekens uit het midden van een woord.
Vind de meest voorkomende elementen
Voor deze niet-lege tabel geeft max(counts, key=counts.get) de waarde 'the' terug. Om de twee meest voorkomende woorden te vinden, gebruik je sorted(counts, key=counts.get, reverse=True)[:2], wat ['the', 'dog'] geeft. Gelijke tellingen behouden bij het sorteren hun oorspronkelijke volgorde.
Het patroon telt ook getallen of tuples. Voor de worpen [3, 6, 3, 1, 6, 3] maakt het {3: 3, 6: 2, 1: 1}. Een waarde die nooit is waargenomen, heeft geen sleutel-waardepaar. Lees die met een standaardwaarde van nul als dat nuttig is.
Herken de verkorte aanpak uit de bibliotheek
from collections import Counter
letter_counts = Counter("banana")
print(letter_counts.most_common(1))
print(letter_counts["z"])
Dit drukt [('a', 3)] en daarna 0 af. De import maakt Counter uit de standaardbibliotheek van Python beschikbaar. Een Counter is een dictionary die voor tellingen is ontworpen: de sleutels zijn hashbare elementen en het rechtstreeks opzoeken van een ontbrekend element geeft nul terug. De weergegeven tellingen voor deze invoer zijn Counter({'a': 3, 'n': 2, 'b': 1}).
Belangrijkste punten
- Een frequentietabel koppelt elk verschillend element aan de bijbehorende telling.
- Initialiseer de dictionary vóór de lus.
counts[item] = counts.get(item, 0) + 1verwerkt nieuwe en herhaalde elementen.- Schoon woorden vóór het tellen op als hoofdletters en leestekens moeten worden genegeerd.
- Vergelijk tellingen met
key=counts.getom elementen te rangschikken. Countermaakt tellingen en geeft nul terug bij het opzoeken van een ontbrekende sleutel.
3.2 Groepeer elementen en tel waarden op per categorie
Een dictionary kan onder elke sleutel een hele groep opslaan. De sleutel geeft de categorie aan en een lijst bevat de elementen die eraan zijn toegewezen. Zo blijft elk lid beschikbaar voor latere totalen, gemiddelden of rapporten.
Maak afzonderlijke lijsten voor groepen
words = ["apple", "bean", "avocado", "beet", "corn"]
groups = {}
for word in words:
first = word[0]
if first not in groups:
groups[first] = []
groups[first].append(word)
Voor "apple" maakt het programma een lege lijst onder "a" en voegt het het woord toe. "bean" begint een afzonderlijke lijst onder "b". "avocado" komt in de bestaande lijst onder "a". Het resultaat is {'a': ['apple', 'avocado'], 'b': ['bean', 'beet'], 'c': ['corn']}.
De lege lijst wordt alleen voor een nieuw label gemaakt. Als je die bij elke doorgang zou maken, zouden de eerdere leden van die groep verloren gaan.
Verkort de initialisatie
groups.setdefault(word[0], []).append(word) voert dezelfde groepeerstap uit. setdefault geeft de bestaande lijst terug als die er is. Anders slaat het de opgegeven lege lijst op en geeft die terug. De daaropvolgende append wijzigt de teruggegeven lijst.
Een andere mogelijkheid maakt lijsten automatisch aan:
from collections import defaultdict
groups = defaultdict(list)
for word in words:
groups[word[0]].append(word)
Geef list, de functie die een nieuwe lijst maakt, zonder ronde haakjes door. Wanneer een ontbrekende sleutel wordt opgezocht, maakt deze defaultdict een nieuwe lege lijst en slaat die op. Zelfs een leesactie zoals groups["z"] voegt die ontbrekende sleutel toe. Gebruik "z" in groups als je alleen wilt controleren of een groep bestaat.
Houd de lijsten onafhankelijk
groups = dict.fromkeys(["a", "b"], []) plaatst dezelfde lijst onder beide sleutels. Als je via groups["a"] de waarde 1 toevoegt, geeft dat {'a': [1], 'b': [1]}. De lijsten worden gedeeld, niet gekopieerd.
Om met afzonderlijke lijsten te beginnen, gebruik je {key: [] for key in keys}, setdefault met een nieuwe [] of defaultdict(list). Elke nieuwe categorie moet een eigen lijstobject krijgen.
Tel bedragen per categorie op
Bij tellen tel je één op per voorkomen. Bij een categorietotaal tel je het bedrag van elk element op:
expenses = [("food", 12.5), ("travel", 30),
("food", 7.25), ("books", 18)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
Voeding begint bij 12,5 en krijgt er daarna 7,25 bij, wat eindigt op 19,75. Reizen komt uit op 30 en boeken op 18. Als je alleen amount zou opslaan, zou dat het vorige totaal vervangen in plaats van erbij worden opgeteld.
Bereken een gemiddelde of ontdubbel een groep
Voor scores = {"A": [80, 90], "B": [70]} doorloop je scores.items() en bereken je sum(values) / len(values). Groep A heeft een gemiddelde van 85,0; groep B een gemiddelde van 70,0. Toets if values: voordat je deelt, zodat een lege groep afzonderlijk wordt afgehandeld.
Gebruik verzamelingen als waarden wanneer herhalingen binnen elke groep moeten verdwijnen. tags.setdefault(post, set()).add(tag) maakt een verzameling voor een nieuw bericht en voegt het label toe. Een herhaald label blijft één element; een lijst zou elk voorkomen bewaren.
Belangrijkste punten
- Groeperen koppelt een categorie aan haar leden, vaak in een lijst.
- Maak voor elke groep een nieuwe lijst.
setdefaultendefaultdict(list)vereenvoudigen de initialisatie van groepen.- Categorietotalen tellen bedragen op; voor gemiddelden deel je de som van elke groep door het eigen aantal.
- Gebruik verzamelingen als groepswaarden wanneer herhaalde leden moeten verdwijnen.
4Modelleer gestructureerde gegevens met geneste dictionary’s
Bij elkaar horende velden vormen samen een record en meerdere records kunnen op ID worden geordend of als rijen in een lijst worden bewaard. Om de juiste waarde te bereiken, doorloop je elk niveau op volgorde. Rapporten combineren vervolgens een buitenste lus over records met het opzoeken van velden of een binnenste lus over een opgeslagen lijst. Ontbrekende optionele velden, lege lijsten en gedeelde binnenste objecten beïnvloeden elk hoe je die records leest, samenvat of kopieert.
4.1 Sla records op in geneste dictionary’s en benader ze
Een record brengt samenhangende velden bij elkaar, zoals de leeftijd, studierichting en cijfers van een student. Een geneste dictionary slaat een andere dictionary op als waarde. De buitenste sleutels kunnen records aanduiden, terwijl de binnenste sleutels velden aanduiden.
Lees één niveau tegelijk
students = {
"ana": {"age": 19, "major": "math", "grades": [88, 92]},
"ben": {"age": 22, "major": "history", "grades": [75, 81, 79]},
}
students["ana"] geeft Ana’s recorddictionary. Door ["major"] toe te voegen lees je haar studierichting, dus students["ana"]["major"] geeft 'math' terug. Voor Bens laatste cijfer bereikt students["ben"]["grades"][-1] het record, daarna de lijst en vervolgens het laatste lijstelement, 79.
Elke zoekactie werkt op het object dat de vorige zoekactie teruggeeft. Dezelfde syntaxis met vierkante haakjes kan op het ene niveau een dictionarysleutel betekenen en op een ander niveau een lijstpositie.
Wijzig een veld of voeg een record toe
students["ana"]["age"] = 20
students["ben"]["email"] = "ben@example.com"
students["cara"] = {"age": 21, "major": "art", "grades": []}
students["cara"]["grades"].append(90)
De eerste twee regels wijzigen velden in bestaande records of voegen er velden aan toe. De derde voegt een volledig record toe onder een nieuwe ID. De vierde bereikt Cara’s cijferlijst en voegt er een cijfer aan toe.
De toekenning students["dev"]["age"] = 30 mislukt omdat het buitenste opzoeken van "dev" eerst gebeurt en KeyError: 'dev' opwerpt. Maak het record aan voordat je waarden aan de velden toekent.
Voor een optionele leesactie geeft students.get("dev", {}).get("age") de waarde None terug. De eerste standaardwaarde is een lege dictionary, zodat de tweede get een dictionary heeft om te lezen, ook als het record ontbreekt. Bij deze records is elke buitenste waarde zelf een dictionary.
Kies een structuur die bij het benaderen past
Een lijst van dictionary’s houdt rijen op volgorde:
rows = [{"name": "Ana", "city": "Austin"},
{"name": "Ben", "city": "Denver"}]
print(rows[1]["city"])
Dit drukt Denver af: eerst de lijstindex, daarna de veldsleutel. Een dictionary van lijsten, zoals {"A": [80, 90], "B": [70]}, slaat meerdere waarden per label op. Je kunt deze structuren combineren als een record zowel benoemde velden als een geordende lijst nodig heeft.
Wanneer namen rijen uniek aanduiden, maak je by_name = {row["name"]: row for row in rows}. Daarna vindt by_name["Ben"] Bens rij rechtstreeks. De waarden zijn de bestaande rijdictionary’s, dus wijzigingen via deze index beïnvloeden ook die rijen. Als namen zich herhalen, vervangt een latere rij een eerdere onder die sleutel.
Kopieer geneste gegevens bewust
backup = students deelt de volledige dictionary. backup = students.copy() maakt een afzonderlijke buitenste dictionary, maar behoudt dezelfde binnenste records. Na die ondiepe kopie verandert backup["ana"]["age"] = 99 ook Ana’s leeftijd in students.
import copy
independent = copy.deepcopy(students)
independent["ana"]["age"] = 25
Voor deze geneste dictionary’s en lijsten maakt de diepe kopie ook afzonderlijke binnenste objecten. Als je de gekopieerde leeftijd wijzigt, blijft de oorspronkelijke leeftijd ongewijzigd. Gebruik consistente veldnamen in alle records, zodat dezelfde zoekcode voor elk record werkt.
Belangrijkste punten
- Aaneengeschakelde zoekacties doorlopen één collectie tegelijk.
- Maak een binnendictionary voordat je een waarde toekent aan een veld erin.
- Een lijst van records gebruikt eerst een index; een dictionary van records gebruikt een ID.
- Een ondiepe kopie deelt binnenste records; een diepe kopie maakt geneste wijzigbare gegevens afzonderlijk.
4.2 Doorloop geneste gegevens met lussen en vat ze samen
Bij het verwerken van geneste gegevens houd je bij welk niveau de lus heeft bereikt. Een buitenste lus kiest een record. Door een veld op te zoeken bereik je een waarde binnen dat record en een binnenste lus kan vervolgens de elementen van een opgeslagen lijst doorlopen.
Vat per doorgang één record samen
students = {
"ana": {"major": "math", "grades": [88, 92]},
"ben": {"major": "history", "grades": [75, 81, 79]},
"cara": {"major": "art", "grades": []},
}
for name, info in students.items():
grades = info["grades"]
major = info["major"]
if grades:
average = sum(grades) / len(grades)
print(f"{name}: {major}, average {average:.1f}")
else:
print(f"{name}: {major}, no grades")
Ana’s cijfers tellen op tot 180, dus haar gemiddelde is 90,0. Bens totaal is 235 over drie cijfers, wat ongeveer 78,33 geeft; de opmaak :.1f toont 78,3. Cara’s lijst is leeg, dus drukt het programma cara: art, no grades af zonder door nul te delen.
Door grades en major binnen de lus toe te kennen, krijgt elke naam de waarden van het huidige record. Ook het gemiddelde hoort binnen de lus: het moet voor elke student afzonderlijk worden berekend.
Lees optionele velden
info.get("email", "no email") levert tekst voor een optioneel e-mailveld. Een directe info["email"] zou KeyError opwerpen voor een record zonder dat veld. Een standaardwaarde hoort op het niveau waar het veld kan ontbreken. De get van de buitenste dictionary zou student-ID’s doorzoeken, geen e-mailvelden.
Selecteer records
math_students = []
for name, info in students.items():
if info["major"] == "math":
math_students.append(name)
Dit levert ['ana'] op. De voorwaarde leest een veld van het huidige record; de toegevoegde waarde is de buitenste sleutel. Als het rapport volledige records nodig had, zou het in plaats daarvan info kunnen toevoegen. Bepaal welk soort resultaat het volgende deel van het programma nodig heeft.
Doorloop elk opgeslagen cijfer
count = 0
for info in students.values():
for grade in info["grades"]:
if grade > 80:
count += 1
De binnenste lus doorloopt Ana’s 88 en 92, daarna Bens 75, 81 en 79. Cara’s lege lijst levert geen doorgangen op. Drie cijfers zijn hoger dan 80: 88, 92 en 81. De telling wordt buiten beide lussen geïnitialiseerd omdat die alle studenten samen beschrijft. Als je die binnen de buitenste lus opnieuw zou instellen, zou alleen de telling van het laatste record overblijven.
Tel records op basis van een veld
majors = {}
for info in students.values():
major = info["major"]
majors[major] = majors.get(major, 0) + 1
Elk record telt één op bij zijn studierichting. Voor alleen Ana en Ben is het resultaat {'math': 1, 'history': 1}; als Cara meetelt, komt daar 'art': 1 bij. Om een ander veld op te tellen of te groeperen, behoud je de buitenste lus over records en verander je de waarde die het record bijdraagt.
Druk voor leesbare rapporten één opgemaakte regel per record af in plaats van de hele geneste dictionary. Sla in een f-string een veld eerst op in een variabele, zoals hierboven, of gebruik het andere type aanhalingstekens binnen de accolades, zoals in f"{name}: {info['major']}".
Belangrijkste punten
- Een buitenste lus kiest een record; binnen dat record zoek je velden op.
- Controleer op een lege lijst voordat je door de lengte ervan deelt.
- Gebruik
getop het record voor een optioneel veld. - Een binnenste lus doorloopt elk element in de lijst van een record.
- Zet een accumulator buiten de lussen waarvan die de resultaten combineert.
5Gebruik verzamelingen om duplicaten te verwijderen en collecties te vergelijken
Bij verzamelingen draait het om welke waarden aanwezig zijn. Duplicaten verwijderen en lidmaatschap vergelijken worden directe bewerkingen, van het vinden van gezamenlijke cursusinschrijvingen tot het controleren van ontbrekende vaardigheden. Voor volgorde en herhaalde voorkomens zijn andere collecties nodig, dus de keuze is belangrijk voordat je gegevens omzet. Verzamelingen sluiten ook aan op dictionary’s: hun sleutels kunnen als verzamelingen worden vergeleken, ook als de opgeslagen waarden verschillen.
5.1 Maak verzamelingen en verwijder duplicaten
Een verzameling houdt bij welke verschillende waarden aanwezig zijn. Elk element komt er één keer in voor en de volgorde is niet gegarandeerd. Verzamelingen zijn geschikt voor lidmaatschapscontroles en voor het verwijderen van duplicaten wanneer het aantal voorkomens niet van belang is.
Maak een verzameling
colors = {"red", "green"}
numbers = set([3, 1, 3, 2, 1])
print(len(numbers))
print(sorted(numbers))
Dit drukt 3 en daarna [1, 2, 3] af. Herhaalde invoer wordt één element. Een lege verzameling is set(); {} maakt een lege dictionary.
set("banana") doorloopt de tekens van de string en houdt de verschillende letters "a", "b" en "n" over. {"banana"} geeft de hele string als één element. Net als bij dictionarysleutels tellen gelijke numerieke waarden één keer: {1, 1.0, True} heeft één element.
Elementen moeten hashbaar zijn. Getallen, strings en tuples van hashbare waarden werken; lijsten, dictionary’s en gewone verzamelingen niet. Gebruik (1, 2) als coördinatenelement in plaats van [1, 2]. Een frozenset is een onwijzigbare verzameling en kan zelf een element van een verzameling of een dictionarysleutel zijn.
Werk zonder posities
colors[0] werpt TypeError op omdat een verzameling geen posities heeft. De afdrukvolgorde is niet gegarandeerd en stringelementen kunnen bij een andere uitvoering in een andere volgorde verschijnen. sorted(colors) maakt een nieuwe gesorteerde lijst als de elementen vergelijkbaar zijn. Het geeft de verzameling zelf geen volgorde.
Wijzig de elementen
| Bewerking | Wat gebeurt er? |
|---|---|
s.add(x) | Voegt één element toe; een duplicaat heeft geen effect. |
s.update(items) | Voegt elementen uit een itereerbaar object toe. |
s.remove(x) | Verwijdert x; een ontbrekend element werpt KeyError op. |
s.discard(x) | Verwijdert x als het aanwezig is; ontbreken is toegestaan. |
s.pop() | Verwijdert een willekeurig element en geeft het terug. |
s.clear() | Verwijdert elk element. |
add("blue") voegt één string toe. update(["blue", "gold"]) voegt twee strings toe. update("blue") voegt daarentegen afzonderlijke tekens toe, omdat een string itereerbaar is. Verzamelingen hebben geen methode append.
Behoud zo nodig de volgorde van eerste voorkomens
list(set(items)) verwijdert duplicaten, maar verliest de oorspronkelijke volgorde. Als de volgorde van eerste voorkomens belangrijk is, gebruik je de invoegvolgorde van een dictionary:
items = [3, 1, 3, 2, 1]
unique = list(dict.fromkeys(items))
print(unique)
Dit drukt [3, 1, 2] af. De waarden worden dictionarysleutels, zodat elke waarde één keer verschijnt in de volgorde waarin ze voor het eerst voorkwam.
Je kunt de rollen ook expliciet houden:
seen = set()
unique = []
for item in items:
if item not in seen:
seen.add(item)
unique.append(item)
De verzameling geeft aan of een element al is voorgekomen; de lijst bewaart de eerste voorkomens op volgorde. Beide vormen vereisen hashbare invoerelementen.
Tel verschillende elementen of controleer lidmaatschap
Voor de acht woorden in "the cat saw the dog the dog ran".split() is len(set(words)) gelijk aan 5: the, cat, saw, dog en ran. Dit telt verschillende woorden, niet hoe vaak ze voorkomen.
Met een verzameling van geblokkeerde afzenders geeft sender in blocked aan of een adres aanwezig is. Bij grote collecties is een lidmaatschapscontrole op een verzameling of dictionary doorgaans veel sneller dan een lijst element voor element doorzoeken.
Belangrijkste punten
- Een verzameling slaat unieke hashbare elementen op zonder gegarandeerde volgorde.
- Gebruik
set()voor een lege verzameling;{}is een dictionary. removewerpt een fout op als het element ontbreekt;discardstaat ontbreken toe.sorted(s)geeft een lijst terug; elementen van een verzameling hebben geen posities.list(dict.fromkeys(items))verwijdert herhalingen en behoudt de volgorde van eerste voorkomens.len(set(items))telt verschillende waarden.
5.2 Vergelijk collecties met verzamelingsbewerkingen
Verzamelingsbewerkingen drukken vragen uit over lidmaatschap van twee collecties. Gebruik de bewerking die bij de vraag past: iedereen in de ene of de andere collectie, alleen gedeelde leden of leden die na uitsluiting overblijven.
Bekijk de vier bewerkingen
Stel dat de cursusinschrijvingen zijn:
python = {"Ana", "Ben", "Cara", "Dev"}
sql = {"Ben", "Dev", "Eli"}
| Expressie | Lidmaatschapsregel | Leden, alfabetisch weergegeven |
|---|---|---|
| `python | sql` | In de ene of de andere verzameling of in beide |
python & sql | In beide verzamelingen | Ben, Dev |
python - sql | In Python maar niet in SQL | Ana, Cara |
python ^ sql | In precies één verzameling | Ana, Cara, Eli |
De vereniging bevat alle vijf studenten één keer. De doorsnede bevat alleen de twee gedeelde studenten. Het verschil begint bij de linkerverzameling en sluit alles uit wat in de rechterverzameling zit. Als je het verschil omkeert, verandert de vraag: sql - python bevat alleen Eli. Het symmetrisch verschil bevat de twee niet-overlappende delen; het is gelijk aan de vereniging min de doorsnede.
De benoemde vormen zijn python.union(sql), python.intersection(sql), python.difference(sql) en python.symmetric_difference(sql).
Toets een relatie
a <= b vraagt of elk element van a tot b behoort. Dat is de deelverzamelingstoets. a < b vereist bovendien dat b ten minste één extra element heeft, waardoor a een echte deelverzameling is. a >= b en a > b toetsen de bijbehorende relaties voor bovenverzamelingen.
print({"Ben"} <= sql)
print(sql <= sql)
print(sql < sql)
print(python.isdisjoint(sql))
Dit drukt True, True, False en False af. Een verzameling is een deelverzameling van zichzelf, maar geen echte deelverzameling van zichzelf. Disjuncte verzamelingen hebben geen gedeelde elementen; Python en SQL delen Ben en Dev. De methodevormen issubset en issuperset geven ook booleaanse resultaten terug.
Houd resultaten afzonderlijk of wijzig een verzameling
result = a | b maakt een nieuwe verzameling en laat beide invoerverzamelingen ongewijzigd. De vormen voor bewerking ter plaatse a |= b, a &= b, a -= b en a ^= b veranderen a in de vereniging, doorsnede, het verschil of het symmetrisch verschil. Elke andere naam die naar dezelfde verzameling verwijst, ziet de wijziging.
Benoemde verzamelingsmethoden accepteren itereerbare objecten zoals lijsten. python.union(["Fay"]) werkt. De gewone verzamelingsoperatoren vereisen verzamelingen als operanden: {"a"} | ["b"] werpt TypeError op.
Gebruik | om verzamelingen te combineren, niet +. Houd ook & en and uit elkaar: {1, 2} and {3} geeft {3} terug omdat de linkerverzameling als waar wordt beschouwd. Het berekent geen gemeenschappelijke elementen.
Vind ontbrekende vereisten
required = {"python", "sql", "git"}
skills = {"python", "excel", "git"}
missing = required - skills
extra = skills - required
qualified = required <= skills
De verzameling met ontbrekende vaardigheden bevat "sql"; de verzameling met extra vaardigheden bevat "excel". De doorsnede bevat "git" en "python". qualified is False, omdat ten minste één vereiste vaardigheid ontbreekt. Een kandidaat kan veel vaardigheden hebben en toch niet slagen voor de deelverzamelingstoets: alle specifieke vereiste elementen moeten aanwezig zijn.
Belangrijkste punten
|neemt elementen uit de ene of de andere verzameling,&uit beide en^uit precies één verzameling.a - bbehoudt alleen elementen vanadie ontbreken inb.<=staat gelijke verzamelingen toe;<vereist een echte deelverzameling.isdisjointtoetst of er geen gedeelde elementen zijn.- Gewone verzamelingsoperatoren maken resultaten; vormen voor bewerking ter plaatse wijzigen de linkerverzameling.
5.3 Kies de juiste collectie voor een taak
Kies een collectie op basis van wat het programma ermee moet doen. Volgorde, herhalingen, opzoeken op naam en wijzigbaarheid zijn afzonderlijke behoeften. Een programma kan meerdere collectietypen gebruiken omdat verschillende delen van de gegevens verschillende taken dienen.
Vergelijk de ingebouwde collecties
| Type | Hoe bereik je gegevens? | Volgorde en herhalingen | Kan de collectie veranderen? |
|---|---|---|---|
| Lijst | Via positie | Geordend; herhalingen toegestaan | Ja |
| Tuple | Via positie | Geordend; herhalingen toegestaan | Nee |
| Dictionary | Via sleutel | Invoegvolgorde; unieke sleutels | Ja |
| Verzameling | Via lidmaatschap | Geen gegarandeerde volgorde; unieke elementen | Ja |
Een lijst past bij een reeks gebeurtenissen: de volgorde is belangrijk en dezelfde gebeurtenis kan meer dan eens voorkomen. Een tuple past bij een vaste groep samenhangende waarden, zoals coördinaten. Een tuple kan een wijzigbaar object bevatten, dus de vaste plaatsen van de tuple maken niet elk object erin onwijzigbaar. Alleen een tuple met hashbare elementen kan een dictionarysleutel of een element van een verzameling zijn.
Een dictionary past bij benoemde informatie: een ID leidt naar een record of een productnaam leidt naar een hoeveelheid. De waarden mogen zich herhalen en kunnen volledige collecties zijn. Een verzameling past bij een lidmaatschapsvraag: het programma moet weten of een ID aanwezig is, zonder een afzonderlijke waarde ervoor nodig te hebben.
Behoud de informatie die de taak nodig heeft
Als je [1, 2, 1] omzet naar een verzameling, verlies je zowel het herhaalde voorkomen als de volgorde. Dat is nuttig voor een lijst van verschillende elementen, maar onjuist voor een volledig gebeurtenissenlogboek. Een dictionary zoals {"reader": True, "editor": True} kan vaak worden vervangen door {"reader", "editor"} als de waarden geen aanvullende informatie bevatten. Als elke rol een machtigingsniveau nodig heeft, behoud je de dictionary.
Gelijkheid volgt de betekenis van elke collectie. [1, 2] == [2, 1] is False, omdat de volgorde verschilt. {1, 2} == {2, 1} is True. Dictionary’s met gelijke sleutel-waardeparen zijn bij vergelijking gelijk, ook als de sleutels in een andere volgorde zijn ingevoegd. Hun invoegvolgorde beïnvloedt het itereren, niet die gelijkheidstoets.
Vergelijk dictionarysleutels als verzamelingen
store_a = {"pens": 10, "pads": 4, "ink": 2}
store_b = {"pads": 7, "clips": 30, "ink": 5}
common = store_a.keys() & store_b.keys()
only_a = store_a.keys() - store_b.keys()
De gemeenschappelijke sleutels zijn "ink" en "pads"; only_a bevat "pens". Dit zijn producten die worden verkocht, ongeacht hun hoeveelheden. De twee winkels hebben verschillende hoeveelheden inkt, maar inkt is nog steeds een gedeelde sleutel.
Sleutelweergaven van dictionary’s ondersteunen verzamelingsbewerkingen omdat sleutels uniek en hashbaar zijn. Waardeweergaven ondersteunen deze operatoren niet: store_a.values() & {1} werpt TypeError op. Waarden naar een verzameling omzetten is mogelijk als ze hashbaar zijn, maar verwijdert herhaalde waarden en stelt een andere vraag dan het vergelijken van productsleutels.
Combineer structuren in één programma
Een bibliotheek kan een dictionary gebruiken die boek-ID’s aan recorddictionary’s koppelt, een verzameling van momenteel uitgeleende ID’s en een lijst van de uitleningen van vandaag in tijdvolgorde. Een tuple zoals ("Dune", 1965) houdt een titel en jaar bij elkaar. De dictionary vindt de gegevens van een boek; de verzameling controleert de uitleenstatus; de lijst bewaart de geschiedenis van de dag.
Belangrijkste punten
- Gebruik dictionary’s om op naam of ID op te zoeken en verzamelingen voor lidmaatschap van unieke elementen.
- Gebruik lijsten voor geordende, wijzigbare sequenties en tuples voor vaste groepen.
- Gelijkheid van lijsten hangt af van de volgorde; gelijkheid van dictionary’s en verzamelingen niet.
- Verzamelingsbewerkingen op sleutelweergaven vergelijken sleutels, niet de waarden die eronder zijn opgeslagen.
Dictionary’s en verzamelingen in Python: voorbeelden
1Maak en onderhoud een voorraaddictionary
14 stappen
- 1IntroductieVind informatie op naam
Een voorraad moet een productnaam aan de hoeveelheid koppelen. Een dictionary slaat die relatie op als een sleutel-waardepaar: de naam is de sleutel en de hoeveelheid is de waarde.
Je maakt een kleine voorraad, bepaalt wat een ontbrekend product betekent en volgt wijzigingen in bestaande en nieuwe producten stap voor stap. Houd twee zaken afzonderlijk bij: of een sleutel bestaat en welke waarde eronder is opgeslagen.
- 2VoorbeeldSchrijf de eerste voorraad
stock = {"pens": 10, "pads": 4}Elke dubbele punt koppelt een sleutel aan zijn waarde en de komma scheidt de paren.
stock["pens"]leest10;len(stock)is2, het aantal paren.De sleutel duidt het product aan.
stock[0]zou zoeken naar de sleutel0, niet naar het eerste product. Hoewel dictionary’s de invoegvolgorde bewaren, bereik je hun sleutel-waardeparen nog steeds via sleutels. - 3UitlegKies sleutels die Python kan opslaan
Sleutels moeten hashbaar zijn. Strings en getallen werken, net als tuples die alleen hashbare elementen bevatten. Een locatie zoals
(2, 3)kan één sleutel zijn, terwijl de lijst[2, 3]dat niet kan.Waarden kunnen van elk type zijn, ook lijsten of dictionary’s. Deze regel geldt voor de sleutel, dus een lijst als waarde opslaan maakt het paar niet ongeldig.
- 4UitdagingTel de opgeslagen paren
Wat is de lengte van
{"pens": 10, "pads": 4, "pens": 7}en welke waarde is opgeslagen voor"pens"?---reveal---
De lengte is
2en pennen heeft de waarde7. Het latere paar vervangt de eerdere waarde onder dezelfde sleutel. Het maakt geen tweede sleutel-waardepaar voor pennen. Verschillende sleutels mogen een waarde delen, maar één sleutel kan niet twee afzonderlijke paren bevatten. - 5UitlegBepaal wat ontbreken betekent
stock["clips"]werptKeyErrorop omdat de huidige voorraad geen sleutel voor paperclips heeft. Gebruik direct opzoeken wanneer een record verplicht is en een ontbrekend record aandacht vraagt.stock.get("clips", 0)geeft daarentegen de vervangende waarde nul terug zonder paperclips toe te voegen. Dat past bij een berekening waarin een ontbrekend product moet tellen als geen opgeslagen voorraad. De dictionary heeft na deze aanroep nog steeds twee sleutel-waardeparen. - 6KernpuntEen opgeslagen nul heeft nog steeds een sleutel
Stel dat
stock["pads"] = 0vastlegt dat schrijfblokken zijn uitverkocht."pads" in stockis nog steedsTrue, omdat het record bestaat.if stock.get("pads"):slaat de tak over omdat nul onwaar is. Die toets kan geen onderscheid maken tussen uitverkocht en een ontbrekend record datNoneteruggeeft. Als de vraag is of een record bestaat, toets je de sleutel metin. - 7UitdagingHoud uitverkochte producten zichtbaar
Je begint met
stock = {"pens": 10, "pads": 0}. Een rapport moet de hoeveelheid voor schrijfblokken tonen en"missing"afdrukken voor een ontbrekend product. Welke toets moet bepalen ofstock[item]wordt gelezen?---reveal---
Gebruik
if item in stock:. Schrijfblokken voldoen aan die toets en de uitvoer toont nul. Druk in deelse-tak"missing"af. Een toets op de waarheidswaarde van de teruggegeven hoeveelheid zou het uitverkochte record ten onrechte als ontbrekend behandelen. - 8VoorbeeldVerwerk een verkoop en een levering
Begin met een nieuwe voorraad:
stock = {"pens": 10, "pads": 4} stock["pens"] -= 3 stock["clips"] = 50De verkoop leest de oude hoeveelheid pennen en slaat
7op. De levering maakt een nieuwe sleutel voor paperclips met de waarde50. De regel met-=vereist dat pennen al bestaat; een gewone toekenning kan een ontbrekende sleutel aanmaken. Een dictionary heeft geen methodeappend. - 9VoorbeeldHaal een verwijderde hoeveelheid op
Ga verder met de voorraad:
removed = stock.pop("pads")removedwordt4en de dictionary wordt{"pens": 7, "clips": 50}.popwijzigt de collectie en geeft ook de verwijderde waarde terug.Gebruik
del stock["pads"]als je alleen hoeft te verwijderen. Beide vormen werpen bij ontbrekenKeyErrorop, tenzijpopeen standaardwaarde krijgt, zoalsstock.pop("pads", 0). - 10UitdagingHandel een tweede verwijdering af
De huidige voorraad is
{"pens": 7, "clips": 50}. Wat geeftstock.pop("pads", 0)terug en wat gebeurt er met de voorraad?---reveal---
De aanroep geeft
0terug en laat de voorraad ongewijzigd, omdat schrijfblokken al ontbreken. De standaardwaarde voorkomt een fout door een ontbrekende sleutel; er wordt geen sleutel-waardepaar voor schrijfblokken gemaakt. Een bestaande sleutel zou wel worden verwijderd en de opgeslagen waarde ervan zou worden teruggegeven. - 11UitlegVoeg instellingen samen zonder de basis te verliezen
Voor twee dictionary’s maakt
base | overrideseen nieuw resultaat en geldt bij gedeelde sleutels de rechterwaarde:base = {"size": 2, "color": "blue"} result = base | {"size": 5}resultheeft grootte5en kleur"blue";baseheeft nog steeds grootte2. Deze operator is beschikbaar sinds Python 3.9.base.update(overrides)zou daarentegen de basis wijzigen enNoneteruggeven. - 12TipVolg de volgorde bij wijzigingen
Als je een waarde vervangt, blijft de sleutel op zijn plaats. Als je een sleutel verwijdert en opnieuw toevoegt, komt die achteraan.
popitem()verwijdert het laatst ingevoegde paar, niet de grootste waarde.Maak ook onderscheid tussen retourwaarden van methoden:
update()enclear()gevenNoneterug, terwijlpop()een waarde teruggeeft. Ken een resultaat van bijwerken niet opnieuw toe aan de naam die je voor de dictionary nodig hebt. - 13UitdagingGebruik een standaardwaarde zonder te overschrijven
Een programma begint met
stock = {"pens": 7}. Het roeptstock.get("clips", 20)aan, daarnastock.setdefault("clips", 5)en telt vervolgens2op bijstock["clips"]. Wat is de uiteindelijke hoeveelheid paperclips?---reveal---
Die is
7.getgeeft20terug, maar voegt niets toe. Daarna maaktsetdefaulteen sleutel voor paperclips met5en de laatste wijziging telt er2bij op. Een standaardwaarde bij het opzoeken is geen opgeslagen waarde, tenzij een bewerking die daadwerkelijk toevoegt. - 14SamenvattingHoud de sleutel en de waarde bij
Maak een dictionary van sleutel-waardeparen en kies daarna bewust hoe je opzoekt: directe toegang voor verplichte records,
invoor het bestaan van een sleutel engetvoor een vervangende waarde.Toekenningen voegen toe of vervangen. Verwijdermethoden kunnen bruikbare gegevens teruggeven en samenvoegen kan een nieuwe dictionary maken of een bestaande wijzigen. Noteer bij het stap voor stap volgen van code elke toevoeging, vervanging van een waarde en verwijdering op volgorde.
2Maak rapporten van dictionarygegevens
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKies wat elke lus ontvangt
- 2VoorbeeldOntvang beide delen van een paar
- 3KernpuntEen weergave blijft verbonden
- 4VoorbeeldSorteer op een opgeslagen waarde
- 5UitdagingHoud namen op volgorde van waarde
- 6VoorbeeldMaak een dictionary met een lus
- 7VerbandDruk dezelfde regel compact uit
- 8VoorbeeldFilter eerst en maak dan het paar
- 9UitdagingCombineer een filter en een transformatie
- 10TipControleer de paren voordat je de dictionary maakt
- 11UitdagingVerwijder lage waarden zonder de lus te verstoren
- 12SamenvattingStem de invoer af op het resultaat
3Maak tellingen, groepen en categorietotalen
13 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLaat elke categorie een resultaat verzamelen
- 2VoorbeeldGeef een nieuw element zijn eerste telling
- 3VoorbeeldGebruik nul voor een nog niet aangetroffen element
- 4UitdagingZoek waarom een telling nooit groeit
- 5TipSchoon op voordat je de sleutel kiest
- 6UitlegBehoud de leden van elke groep
- 7VoorbeeldVolg een wijziging van een lijstwaarde
- 8KernpuntElke groep heeft een afzonderlijke lijst nodig
- 9UitdagingVoorspel een automatisch gemaakte nieuwe groep
- 10VoorbeeldTel bedragen op in plaats van voorkomens
- 11VoorbeeldBereken het gemiddelde van de waarden in elke groep
- 12UitdagingKies wat elk record bijdraagt
- 13SamenvattingBehoud het resultaat tussen doorgangen
4Lees geneste records en vat ze samen
11 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieScheid record-ID’s van velden
- 2VoorbeeldVolg het pad naar een cijfer
- 3UitdagingVoeg een veld toe aan een nieuw record
- 4KernpuntEen kopie van de buitenkant kan de binnenkant delen
- 5UitdagingHoud proefcijfers onafhankelijk
- 6VoorbeeldBereken één gemiddelde per record
- 7TipHandel een record zonder cijfers af
- 8VerbandLees velden op recordniveau
- 9VoorbeeldDoorloop alle cijfers in de records
- 10UitdagingCombineer een veld en een opgeslagen lijst
- 11SamenvattingHoud elk niveau zichtbaar
5Vergelijk lidmaatschap en kies collecties
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVraag wie tot elke collectie behoort
- 2UitlegMaak een verzameling van unieke elementen
- 3TipVoeg het bedoelde element toe en verwijder het
- 4VoorbeeldBehoud de volgorde van eerste voorkomens
- 5UitdagingBehoud de oorspronkelijke volgorde van verschillende labels
- 6VoorbeeldVind iedereen of alleen gedeelde studenten
- 7VoorbeeldLees het verschil van links naar rechts
- 8UitdagingVind mensen in precies één club
- 9UitlegControleer elke vereiste
- 10KernpuntMaak onderscheid tussen een resultaat en een gewijzigde verzameling
- 11VerbandBehoud geschiedenis, identiteit en lidmaatschap
- 12VoorbeeldVergelijk sleutels zonder hoeveelheden te vergelijken
- 13UitdagingKies een collectie voor een groeiend logboek
- 14UitdagingCombineer sleutelweergaven met een controle op ontbrekende records
- 15SamenvattingKies eerst de lidmaatschapsvraag
Dictionary’s en verzamelingen in Python: oefenvragen
Set 1: Lees en wijzig Pythoncollecties10 Oefenvragen
Vraag 1 van 10
{"oak": 4, "pine": 7, "oak": 9}?Toon antwoordVerberg antwoord
"oak" behoudt zijn laatste waarde, 9, dus de dictionary heeft de twee sleutels "oak" en "pine". Als je alle drie de geschreven paren telt, mis je de vervanging: een dictionary kan geen twee afzonderlijke sleutel-waardeparen onder dezelfde sleutel bevatten. Het aantal elementen is het aantal verschillende sleutels.Vraag 2 van 10
"east" in levels terug voor levels = {"east": 0, "west": 5}?Toon antwoordVerberg antwoord
"east" een sleutel is en die is aanwezig met een opgeslagen waarde nul. Een nulwaarde maakt een toets op de waarheidswaarde onwaar, maar verwijdert de sleutel niet. Het resultaat van in is een booleaanse waarde, niet de waarde die onder de sleutel is opgeslagen.Vraag 3 van 10
Wat drukt deze code af?
seats = {"front": 6, "back": 8}
removed = seats.pop("front")
seats["back"] -= 2
print(removed, seats["back"])
Toon antwoordVerberg antwoord
pop("front") verwijdert het paar en geeft de waarde terug, dus wordt removed gelijk aan 6. Het resterende aantal zitplaatsen achterin daalt van 8 naar 6. Als je pop behandelt als een methode die None teruggeeft, verwar je die met methoden zoals clear, die een collectie wijzigen zonder een element terug te geven.Vraag 4 van 10
sum({"small": 3, "large": 9}.values()) terug?Toon antwoordVerberg antwoord
3 en 9 en sum telt die op tot 12. De twee sleutel-waardeparen maken de som niet 2; dat zou de lengte van de dictionary zijn. De aanroep van .values() selecteert de hoeveelheden die de berekening nodig heeft.Vraag 5 van 10
{name: len(name) for name in ["elm", "cedar"]}?Toon antwoordVerberg antwoord
len(name) levert de bijbehorende waarde: 3 voor "elm" en 5 voor "cedar". Om de paren om te keren zou de lengte-expressie vóór de dubbele punt en de naamsexpressie erna moeten staan.Vraag 6 van 10
Wat is de waarde van counts["up"] na deze lus?
counts = {}
for move in ["up", "left", "up", "up"]:
counts[move] = counts.get(move, 0) + 1
Toon antwoordVerberg antwoord
"up" slaat 1 op, de tweede verhoogt die naar 2 en de derde verhoogt die naar 3. Het sleutel-waardepaar voor "left" heeft een eigen teller en verhoogt "up" niet. Als je alle vier de lusdoorgangen telt, krijg je het totale aantal bewegingen, niet de frequentie van deze specifieke beweging.Vraag 7 van 10
Wat is groups["r"] na deze code?
groups = {}
for word in ["rose", "mint", "reed"]:
groups.setdefault(word[0], []).append(word)
Toon antwoordVerberg antwoord
"r" en voegt "rose" toe; "reed" komt later in dezelfde lijst. De groep "m" bevat "mint" afzonderlijk. setdefault behoudt een bestaande lijst en vervangt die bij de laatste doorgang dus niet door een nieuwe lege lijst.Vraag 8 van 10
devices["d7"]["ports"][-1] terug voor devices = {"d7": {"ports": [2, 4, 8]}}?Toon antwoordVerberg antwoord
[-1] selecteert het laatste lijstelement, 8. Een dictionarysleutel en een lijstindex hebben verschillende taken binnen de keten. De lijstlengte is 3, maar de expressie vraagt om een element, niet om de lengte.Vraag 9 van 10
len(set([8, 2, 8, 5, 2])) terug?Toon antwoordVerberg antwoord
8, 2 en 5. Herhaalde voorkomens maken geen nieuwe elementen, dus is de lengte 3. De invoerlijst heeft vijf posities, maar bij de omzetting naar een verzameling verdwijnen de extra voorkomens voordat len wordt geëvalueerd.Vraag 10 van 10
{"read", "write"}. Een account heeft {"read", "share"} en een nieuwe toekenning voegt {"write"} toe. Welke expressie toetst of het account na de toekenning aan alle vereisten voldoet?Toon antwoordVerberg antwoord
Set 2: Volg zoekacties, groepen en records stap voor stap10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
result en len(rates) na rates = {"basic": 7} en result = rates.get("plus", 0)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Wat drukt deze code af?
settings = {"sound": 2, "light": 4}
settings.update({"sound": 5})
del settings["sound"]
settings["sound"] = 1
print(list(settings))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
sorted(wait, key=wait.get) terug voor wait = {"A": 9, "B": 3, "C": 6}?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Wat drukt deze code af?
from collections import Counter
counts = Counter([4, 4, 7])
print(counts[9])
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat drukt deze code af?
groups = dict.fromkeys(["indoor", "outdoor"], [])
groups["indoor"].append(12)
groups["outdoor"].append(18)
print(groups["indoor"])
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Wat drukt deze code af?
original = {"r1": {"visits": 2}}
backup = original.copy()
backup["r1"]["visits"] += 3
backup["r2"] = {"visits": 1}
print(original["r1"]["visits"], "r2" in original)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
{"scores": []}. Welke voorwaarde moet sum(scores) / len(scores) beschermen na scores = record["scores"]?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
"paused" uit states en staat toe dat het element ontbreekt?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
morning ^ evening voor morning = {"Ivo", "June", "Kai"} en evening = {"June", "Mina"}?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Debug transformaties van collecties10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
len({1: "first", True: "second", "1": "third"})?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
"missing" als de productsleutel ontbreekt. Welke functie-inhoud voldoet aan die eis?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Welke dictionary blijft na deze omkering over?
team = {"Luz": "design", "Omar": "support", "Pia": "design"}
by_role = {role: name for name, role in team.items()}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
"go" nadat je woorden uit "Go go! Stop." hebt geteld met lower().split() en word.strip(".,!?")?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
[("repair", 14), ("delivery", 6), ("repair", 9)]. Wat is totals["repair"] met totals[category] = totals.get(category, 0) + amount?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
records.get("x9", {}).get("email", "none") terug wanneer "x9" ontbreekt?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Wat drukt deze code af?
records = {"a": {"scores": [6, 9]}, "b": {"scores": [8]},
"c": {"scores": []}}
count = 0
for info in records.values():
for score in info["scores"]:
if score >= 8:
count += 1
print(count)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
list(dict.fromkeys(["z", "m", "z", "a"])) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
{2, 5} < {2, 5} terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Wat drukt deze code af?
first = {"lamp": 4, "cord": 9, "plug": 2}
second = {"cord": 3, "plug": 8, "case": 5}
result = {name: first[name]
for name in first.keys() & second.keys()
if first[name] < second[name]}
print(sorted(result.items()))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Combineer vaardigheden met collecties10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Wat drukt deze code af?
stock = {"bolts": 0}
first = stock.get("nuts", 4)
second = stock.setdefault("nuts", 6)
print(first, second, len(stock))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Wat drukt deze code af?
base = {"size": 2, "mode": 1}
alias = base
merged = base | {"size": 5}
alias["mode"] = 3
print(merged["size"], merged["mode"], base["size"])
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Wat drukt deze code af?
levels = {"low": 2, "high": 8, "mid": 5}
view = levels.keys()
for name in list(levels):
if levels[name] < 5:
del levels[name]
print(list(view))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat levert deze code op?
names = ["Rae", "Sol", "Tia"]
scores = [7, 9]
result = {name: score * 2 for name, score in zip(names, scores)
if score >= 8}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Wat drukt deze code af?
from collections import defaultdict
groups = defaultdict(list)
groups["red"].append(5)
unused = groups["blue"]
print(len(groups), len(unused))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Welk algemeen gemiddelde leveren deze gegevens op als elke score even zwaar weegt?
records = {"p": {"scores": [10, 20]},
"q": {"scores": [90]}, "r": {"scores": []}}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Wat drukt deze code af?
records = {"v1": {"team": "north", "scores": [2, 6]},
"v2": {"team": "south", "scores": []},
"v3": {"team": "north", "scores": [4]}}
totals = {}
for info in records.values():
team = info["team"]
for score in info["scores"]:
totals[team] = totals.get(team, 0) + score
print(totals.get("south", 0), totals["north"])
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Wat drukt deze code af?
required = {"a", "b", "c"}
current = {"a", "d"}
missing = required - current
current |= {"b"}
print(sorted(missing), sorted(required - current))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Wat drukt deze code af?
left = {"x": 2, "y": 4}
right = {"y": 4, "x": 2}
print(left == right, list(left) == list(right))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
aaneengeschakeld opzoeken
devices["d7"]["ports"][0] bereikt een record, de lijst met poorten en vervolgens de eerste poort.aantal verschillende waarden
len(set(items)) als de invoerelementen hashbaar zijn.[7, 7, 2, 7] is twee, terwijl het totale aantal voorkomens vier is.accumulator
B
beschermende controle op een lege lijst
if scores: voorkomt dat een record zonder scores een deling door nul veroorzaakt.bijwerken
stock.update({"soap": 6}) werkt de dictionary bij en geeft None terug, niet de bijgewerkte dictionary.bovenverzameling
a >= b toetst of a alle elementen van b bevat en staat gelijkheid toe.skills >= required controleert of de kandidaat alle vereiste vaardigheden heeft.C
categorietotaal
D
deelverzameling
<= staat toe dat de twee verzamelingen gelijk zijn.required <= skills slaagt alleen wanneer de kandidaat elke vereiste vaardigheid heeft.defaultdict
list is gemaakt, begint een afzonderlijke lege lijst wanneer een nieuwe groepssleutel voor het eerst wordt gelezen.dictionary
{"tape": 8, "glue": 3}.dictionarycomprehensie
{word: len(word) for word in words} slaat onder elk woord een lengte op.dictionaryweergave
keys(), values() of items() teruggeeft en dat wijzigingen in de dictionary weerspiegelt.stock.keys() toont een nieuw product nadat dat product is toegevoegd.diepe kopie
discard
blocked.discard(address) staat toe dat een adres al niet meer geblokkeerd is, zonder een fout op te werpen.disjuncte verzamelingen
a.isdisjoint(b) de waarde True teruggeeft.doorsnede
doorsnede van sleutelweergaven
& toe op sleutelweergaven van dictionary’s en geeft de sleutels terug die in beide dictionary’s voorkomen, zonder hun waarden te vergelijken.E
echte deelverzameling
{2} < {2, 4} is waar, terwijl {2} < {2} onwaar is omdat de verzamelingen gelijk zijn.element
3 komt één keer voor in set([3, 3, 5]), dus heeft de resulterende verzameling maar twee elementen.F
filter
if-clausule van een comprehensie bepaalt welke invoerelementen paren opleveren.if quantity > 0 laat producten met voorraad nul weg bij het maken van een nieuwe dictionary.frequentietabel
[2, 5, 2] slaat een telling van twee op onder 2 en één onder 5.G
gedeelde wijzigbare waarde
dict.fromkeys(keys, []) één lijst onder elke groepssleutel plaatst.gelijkheid van collecties
{"a": 1, "b": 2} gelijk aan dezelfde paren die in omgekeerde volgorde zijn ingevoegd.geneste dictionary
students["ana"]["major"] één veld van Ana’s record lezen.geneste lus
groeperen
"map" en "memo" in dezelfde lijst onder "m".H
hashbaar
(4, 7) is hashbaar en kan een locatie in een raster aanduiden, terwijl de lijst [4, 7] dat niet kan.I
initialisatie
counts = {} binnen de lus zou de tellingen wissen die bij eerdere doorgangen zijn verzameld.invoegvolgorde
"west" vóór "east" staan als die eerst is toegevoegd, ook als de waarde verandert.iteratie
{"west": 4, "east": 9} doorloopt "west" en daarna "east", niet de opgeslagen hoeveelheden.K
KeyError
stock["soap"] werpt KeyError op als er geen sleutel-waardepaar voor zeep in de voorraaddictionary bestaat.L
lidmaatschapscontrole
in of not in om te vragen of een collectie een element bevat; bij een dictionary controleert die de sleutels."soap" in stock blijft waar wanneer de opgeslagen hoeveelheid zeep nul is.lijst
M
mutatie
stock["soap"] = 6 is een mutatie die zichtbaar is via elke andere naam voor die dictionary.O
omkeren van sleutels en waarden
ondiepe kopie
ontdubbelen
list(dict.fromkeys(items)) bewaart hashbare elementen in de volgorde waarin ze voor het eerst voorkwamen.onwijzigbare verzameling (frozenset)
opgemaakt rapport
f"{name}: {average:.1f}" gebruiken om een ID en het afgeronde gemiddelde weer te geven.optioneel veld
get een vervangende waarde kunt geven zonder KeyError op te werpen."no email" worden getoond wanneer een studentrecord het niet bevat.opzoeken via een sleutel
prices["juice"] haalt de opgeslagen prijs op, mits de dictionary een sleutel "juice" heeft.P
pop
inventory.pop("pads") gebruikt pop om de oude hoeveelheid op te halen terwijl dat product wordt verwijderd.popitem
"a" en daarna "b" zijn toegevoegd, geeft popitem() het paar voor "b" terug, ook als de waarde ervan kleiner is.R
record
S
samenvoegen
a | b krijgen gedeelde sleutels hun waarden uit b en blijven beide invoerdictionary’s ongewijzigd.defaults | overrides laat een aangepaste waarde een standaardwaarde voor dezelfde instelling vervangen.setdefault
setdefault maakt een lijst voor een nieuwe categorie en behoudt de lijst voor een bestaande categorie.sleutel
"glue" haalt de hoeveelheid 3 op uit een dictionary die hoeveelheden per productnaam opslaat.sleutel-waardepaar
"room": 12 koppelt de veldnaam "room" aan het getal 12.sleutel-waardeparen
for city, temp in temps.items(): geeft elke stad samen met de bijbehorende temperatuur.standaardwaarde
get van een dictionary.stock.get("soap", 0) is de standaardwaarde nul; de aanroep maakt geen sleutel-waardepaar voor zeep.standaardwaardefunctie
defaultdict zonder argumenten aanroept om een waarde te maken wanneer een ontbrekende sleutel wordt opgezocht.list maakt een nieuwe lege lijst voor elke nieuwe sleutel in defaultdict(list).symmetrisch verschil
T
tekstnormalisatie
"Map" en "map" één sleutel voor de woordtelling laten delen door beide in kleine letters te zetten.teller
"level" registreert twee voorkomens van "l", twee van "e" en één van "v".tuple
("Dune", 1965) houdt een titel en het publicatiejaar als één paar bij elkaar.tuples uitpakken
for name, score in scores.items(): zijn beide delen beschikbaar in de lusinhoud.V
vereniging
morning | evening bevat iedereen die een van beide bijeenkomsten volgt, ook mensen die beide volgen.vergelijkingssleutel
key= is doorgegeven; die waarde wordt gebruikt om elementen te vergelijken terwijl de oorspronkelijke elementen als resultaat behouden blijven.sorted(wait, key=wait.get) is elke opgeslagen wachttijd de vergelijkingssleutel voor de bijbehorende stationsnaam.verschil
a - b bevat elementen van de linkerverzameling die ontbreken in de rechterverzameling, dus is de volgorde van de operanden van belang.required - skills vindt vereisten waaraan de kandidaat niet voldoet, niet de extra vaardigheden van de kandidaat.verzameling
W
waarde
"scores" kan een lijst zijn, zodat één record alle scores van een cursist kan bevatten.Z
zip
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.