7 min lexim
Set-et dhe veprimet me to
Një koleksion pa dublikate
Një set (bashkësi) është një koleksion njësish me dy rregulla përcaktuese: çdo njësi është unike, dhe njësitë janë të parenditura. Nuk ka të parë a të fundit, dhe s'ka pozicion për ta indeksuar. Ajo për të cilën një set është shumë i mirë është t'i përgjigjet shpejt pyetjes "a është kjo gjë këtu?", dhe të mbajë jashtë përsëritjet pa lëvizur ti gishtin.
E shkruan një set me kllapa gjarpërore, si një fjalor por me vlera të thjeshta dhe pa dy pika:
ngjyrat = {"e kuqe", "e gjelbër", "blu"}
Shto një dublikatë dhe set-i thjesht e injoron, sepse e ka tashmë atë vlerë:
ngjyrat.add("e kuqe")
print(ngjyrat) # prapë {"e kuqe", "e gjelbër", "blu"}, në një farë radhe
Meqë s'ka radhë, rregullimi që sheh kur shtyp një set është i çfarëdoshëm dhe nuk është diçka ku të mbështetesh. Mund të ndryshojë mes ekzekutimeve, dhe mund të mos ndryshojë: me tekst zakonisht luhatet, me numra të vegjël të plotë shpesh duket i qëndrueshëm. Asnjëra nuk është premtim. Nëse radha ka rëndësi për ty, set-i është vegla e gabuar; nëse uniciteti ka rëndësi, është pikërisht ajo e duhura.
Ndërtimi dhe testimi i një set-i
Shton një njësi me .add() dhe disa njëherësh me .update(). Teston përkatësinë me in, dhe nxjerr një njësi me .remove():
masat = {36, 38, 40}
masat.add(42)
masat.update([44, 46])
print(38 in masat) # True
masat.remove(36)
Testi i përkatësisë 38 in masat është vetia kryesore. Në një listë të gjatë, kontrolli me in do të thotë skanim njësi për njësi; në një set është zakonisht thuajse i menjëhershëm, dhe mbetet i tillë ndërsa set-i rritet. Kur programi yt vazhdon të pyesë "a e kam parë këtë më parë?", një set zakonisht është përgjigjja.
Mënyra më e shpejtë për të hequr dublikatat nga një listë është ta derdhësh në një set dhe, nëse prapë do një listë, ta derdhësh mbrapsht:
numrat = [4, 2, 4, 7, 2, 9, 7]
numra_unike = list(set(numrat)) # dublikatat ikën
Krahasimi i dy set-eve
Set-et e vlejnë vërtet kur krahason dy prej tyre. Tri veprime mbulojnë shumicën e nevojave, dhe secili i përgjigjet një pyetjeje të thjeshtë për dy grupe:
- Bashkimi (
|) mbledh gjithçka që është në cilindo set: të gjitha njësitë nga të dyja, prapë pa përsëritje. - Prerja (
&) mban vetëm atë që është në të dyja: mbivendosjen. - Diferenca (
-) mban atë që është në të parin por jo në të dytin.
mengjesi = {"Ana", "Beni", "Kara"}
mbremja = {"Beni", "Dea", "Kara"}
print(mengjesi | mbremja) # kushdo që erdhi në cilindo orar
print(mengjesi & mbremja) # kush erdhi në të dyja
print(mengjesi - mbremja) # kush erdhi vetëm në mëngjes
Të shkruara si cikle, secili prej tyre do të merrte disa rreshta dhe një if. Si veprime set-i janë një simbol i vetëm që lexohet thuajse si pyetja nga e cila nise.
Një shembull i punuar: interesa të përbashkëta
Le të themi se dy nxënës listojnë secili klubet ku bëjnë pjesë, dhe ti do t'u sugjerosh një aktivitet që mund ta bëjnë bashkë. Kjo është një prerje: klubet që shfaqen në të dyja listat.
def klube_te_perbashketa(i_pari, i_dyti):
return set(i_pari) & set(i_dyti)
ana = ["shah", "ecje malore", "kor", "kodim"]
beni = ["kodim", "futboll", "shah", "art"]
print(klube_te_perbashketa(ana, beni)) # {"shah", "kodim"}
Mbështjellja e çdo liste me set(...) bën punë të dyfishtë: heq çdo përsëritje të rastësishme dhe zhbllokon operatorin &. Rezultati janë dy klubet që kanë të përbashkëta, të gjetura në një rresht të pastër në vend të një cikli të ndërthurur që krahason çdo klub me çdo tjetër.
Këshillë
Pyet veten se për çfarë shërben vërtet koleksioni. Nëse të duhet radha ose lejon dublikata, përdor një listë. Nëse të duhen kontrolle të shpejta "a është këtu?" ose i do dublikatat të zhdukura, përdor një set. Përputhja e veglës me punën është gjysma e të shkruarit të kodit të qartë.
Provoje tani
Merr dy lista të shkurtra emrash, mbështill secilën me set(...), dhe shtyp tri gjëra: këdo në cilëndo listë me |, emrat në të dyja me &, dhe emrat vetëm në të parën me -. Kontrollo që çdo rezultat përputhet me atë që do ta nxirrje me dorë.
Provo veten
- Një set është i parenditur dhe e mban çdo njësi vetëm një herë. Përmend një detyrë ku këto dy veti janë përshtatje e përsosur, dhe një ku e bëjnë set-in zgjedhjen e gabuar.
- Pse testimi
x in set_i_imzakonisht është shumë më i shpejtë se testimix in lista_imekur koleksioni është i madh? - Dy set-e
adhebpërshkruajnë kush u regjistrua për dy udhëtime. Cili veprim set-i të jep njerëzit që u regjistruan për të dyja, dhe cili të jep ata që u regjistruan vetëm për udhëtimin e parë?
Nga vjen ky mësim
Ndërtuar mbi
- Data Structures and Algorithms
- Për të lexuar më tej: Brian Heinold, A Practical Introduction to Python Programming
Kurset e alphaPlan ndërtohen mbi programe të zhvilluara në klasë, e nuk shpiken për web-in. Kur një pohim mbështetet mbi një standard të jashtëm ose mbi një rast të raportuar, ai emërtohet më sipër që ta kontrollosh vetë e të mos na besosh në fjalë.
Ky kurs u zhvillua nga alphaPlan Center mbi bazën e programeve të realizuara në partneritet me rrjetin American Corners.
Gjete diçka të paqartë, të vjetruar ose që mund të përmirësohet? Sugjero një përmirësim