Albus Percival Wulfric Brian Dumbledore
Ocena 6
V datoteki osebe.csv se nahajajo polna imena vseh oseb iz Harryja Potterja (žal tudi iz kasnejših "dodatkov") in še neke povezave, ki so sicer zanimive, vendar nepovezane z našo nalogo.
Napiši naslednje funkcije:
brez_dodatkov(ime)
prejme polno ime osebe in vrne ime te osebe brez "dodatkov". Klicbrez_dodatkov("Mrs. Molly Weasley")
vrne"Molly Weasley"
, klicbrez_dodatkov("Cygnus Black III")
vrne"Cygnus Blake"
in klicbrez_dodatkov("Madame Rolanda Hooch")
vrne"Rolanda Hooch"
. Dodatki, ki jih morate odstraniti, so'Mr. ', 'Mrs. ', ' III', ' II', ' I', 'the ', 'The ', ' Jr.', 'Sir ', 'Madam ', 'Madame '
. (V seznamu sem prijazno dodal presledke pred ali za "dodatek"; to bi vam lahko pomagalo, če vam ne, pa jih pobrišite.)Pazi:
"Sirius Black III"
mora postati"Sirius Black"
, ne"ius Black"
!po_priimkih()
vrne slovar, katerega ključi so priimki oseb, imena pa množice imen oseb s takšnim priimkom. Predtem tem moraš iz imena pobrisati "dodatke" - kot je opisano zgoraj.- Če je za osebo znano le eno ime (Kreacher, Nagini), brez priimka, naj se ne pojavi v slovarju.
- Če ima oseba več imen, je priimek zadnji, ime pa je prvo. V
"Albus Percival Wulfric Brian Dumbledore"
je priimek Dumbledore, ime pa Albus.
V slovarju, ki ga vrne
po_priimkih
, je pri ključu"Dumbledore"
vrednost{'Albus', 'Ariana', 'Percival', 'Kendra', 'Aberforth'}
.unikatni_priimki()
vrne množico priimkov, ki jih ima le ena oseba.imena()
vrne množico z vsemi (prvimi) imeni vseh oseb.
Ocena 7
podvojena_imena()
vrne množico imen, ki jih ima več oseb. Upoštevaj le prvo ime vsake oseba (npr. Albus in ne tudi Percial, Wulfric, Brian).omembe(besede, beseda)
prejme seznam besed in vrne indekse, na katerih se pojavi podana beseda.Klic
omembe(potter6, "Harry)
, kjer jepotter6
seznam vseh besed 6. dela Harryja Potterja, vrne vse indekse vseh pojavitev besede"Harry"
. (Testi bodo v resnici prejeli tak seznam, pri čemer bodo vsa imena spremenjena v osebna imena, npr. Albus in ne Dumbledore.)
Ocena 8
po_blokih(besede, beseda, sirina)
prejme seznam besed, besedo in širino bloka. Vrniti mora število pojavitev podane besede v blokih besed s podano širino. Klicpo_blokih(potter6, "Harry", 2000)
vrne seznam, ki pove, kolikokrat se Harry pojavi v prvih 2000, v naslednjih 2000, naslednjih 2000 in tako besedah. Če zadnji blok ni poln (ker število besed ni deljivo s širino bloka), ga ignoriraj.imena_po_blokih(besede, imena, sirina)
vrne podobno reč, a v obliki numpyjeve matrike: vrstice predstavljajo bloke, stolpci imena iz podanega seznama imen. Element [i, j] pove, kolikokrat se j-to ime pojavi v i-tem bloku besed.
Ocena 9
sosed(besede, ime, sirina)
vrne slovar, katerega ključi so imena, ki se vsaj enkrat pojavijo za največsirina
mest stran od podanega imena (če jesirina
enaka, na primer,2
, sme biti med imenoma največ ena beseda). Pripadajoče vrednosti so število takšnih pojavitev. Večkratne pojavitve se štejejo večkrat.Klic
sosed("Harry and Ron met Romilda and Romilda asked Harry about Ron".split(), "Harry", 2)
vrne{"Ron": 2, "Romilda": 1}
. Ron se dvakrat pojavi na razdalji (največ) 2, Romilda pa enkrat.Klic
sosed("Harry and Ron met Romilda and Romilda asked Harry about Ron".split(), "Harry", 4)
vrne{"Ron": 2, "Romilda": 3}
. Ron se dvakrat pojavi na razdalji (največ) 2, Romilda pa trikrat (ena Romilda je dovolj blizu obeh Harryjev).
Ocena 10
sovpadanje(besede, ime1, ime2, sirina)
. Tudi ta prejme besedilo knjige in ga spusti čez funkcijopo_imenih
. Nato izračuna "prekrivanje" med osebama po naslednjem postopku. Recimo, da pokličemosovpadanje(besede, "Ginny", "Romilda", 20)
.- Recimo, da se "Ginny" pojavi na indeksih 100, 110, 180, in 250. Tedaj bomo rekli, da Ginny, "pokriva" mesta od 80 do 120 (vključno!), od 90 do 130, od 160 do 200 in od 230 do 270 -- torej besedo, na kateri se pojavi in še 20 besed levo in desno, ker smo 20 podali kot argument
sirina
. Ker istega mesta na pokriva dvakrat, bi bilo prav reči, da pokriva 80 do 130, 160 do 200 in 230 do 270. - Recimo, da se "Romilda" pojave na indeksih 5, 70 in 255. Potem pokriva -15 do 25, 50 do 90 in 235 do 275.
Prekrivanje med njima je potem od 80 do 90 in od 235 do 270. Velikost prekrivanje je 11 + 36 = 47. To je rezultat, ki ga mora vrniti funkcija.
Za preprostejši primer vzemimo klic
sovpadanje("Harry and Ron met Romilda and Romilda asked Harry about Ron".split(), ime1, ime2, 2)
Spodnja slika kaže, katera mesta pokriva katera beseda (mesta so lahko tudi po koncu besedila ali pred začetkom!).
Harry and Ron met Romilda and Romilda asked Harry about Ron Harry: X X X X X X X X X X Ron: X X X X X X X X X X Romilda: X X X X X X X
Prekrivanje med Harry in Ron je 6 (kolikor je istoležnih indeksov v prvi in drugi vrstici), prekrivanje med Harry in Romilda (prva in zadnja vrstica) je 4, prekrivanje med Ron in Romilda pa prav tako 4.
Če zmanjšamo širino na 1,
Harry and Ron met Romilda and Romilda asked Harry about Ron Harry: X X X X X X Ron: X X X X X X Romilda: X X X X X
je prekrivanje med Harry in Ron je 2, med ostalima paroma pa 1.
- Recimo, da se "Ginny" pojavi na indeksih 100, 110, 180, in 250. Tedaj bomo rekli, da Ginny, "pokriva" mesta od 80 do 120 (vključno!), od 90 do 130, od 160 do 200 in od 230 do 270 -- torej besedo, na kateri se pojavi in še 20 besed levo in desno, ker smo 20 podali kot argument
podobnost(besede, ime1, ime2, sirina)
vrne podobno reč, le da število mest, ki jih pokrijeta obe imeni, deli s številom mest, ki ga pokrije vsaj eno od imen.
Testi
- 9 January 2025, 8:30 PM