Teljes útmutató kódpéldákkal

Ebben az oktatóanyagban megismerheti a Python-készletek alapjait és a Python-készletek módosításához használható különféle beállítási módszereket.

A készletek a Python egyik beépített adatstruktúrája. Ha nem ismétlődő elemek gyűjteményével kell dolgoznia, akkor ezt a készletet fogja használni adatstruktúraként.

A következő szakaszokban áttekintjük a python-készletek alapjait és a velük való munkavégzés során használható beállítási módszereket. Ezután megtanuljuk, hogyan hajthatunk végre általános halmazműveleteket Pythonban.

Kezdjük!

A Python készletek alapjai

A Pythonban a halmaz nem ismétlődő elemek rendezetlen gyűjteménye. Ez azt jelenti, hogy a halmaz elemeinek külön kell lenniük.

Hozzáadhat és eltávolíthat elemeket egy halmazból; ezért a halmaz egy változtatható gyűjtemény. Különféle adattípusú elemeket tartalmazhat. A készlet egyes elemeinek azonban olyannak kell lenniük hashálható.

A Pythonban egy objektumról akkor beszélünk, ha a hash értéke soha nem változik. A legtöbb megváltoztathatatlan objektum, például a Python-karakterláncok, sorok és szótárak kivonatolhatók.

Részletesen megismerjük a készletek létrehozását. Egyelőre vegye figyelembe a következő két készletet:

py_set = {0,1,2,(2,3,4),'Cool!'}
py_set = {0,1,2,[2,3,4],'Oops!'}

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-2d3716c7fe01> in <module>()
----> 1 py_set = {0,1,2,[2,3,4],'Oops!'}

TypeError: unhashable type: 'list'

Az első készlet három számot, egy sort és egy karakterláncot tartalmaz. A beállított inicializálás hiba nélkül fut. Míg a második készlet listát tartalmaz sor helyett. A lista egy módosítható gyűjtemény, nem lehet kivonatolni, és az inicializálás TypeError-t dob.

📑 Mindezt összeadva a Python-készletet különálló és hashálható elemek változó gyűjteményeként határozhatjuk meg.

Python készlet létrehozása

Kezdjük azzal, hogy megtanuljuk, hogyan lehet készletet létrehozni Pythonban.

#1. Explicit inicializálás használata

A Pythonban úgy hozhat létre halmazt, hogy megadja a halmaz elemeit, vesszővel elválasztva (,) és kapcsos kapcsos zárójelek közé {}.

py_set1 = {'Python','C','C++','JavaScript'}
type(py_set1)

# Output
set

Ha már dolgozott Python-listákkal, akkor ezt tudja [] üres listát inicializál. Annak ellenére, hogy egy Python-készlet egy pár kapcsos kapcsos {} között van, nem használhat {} párt inicializálására. Ez azért van, mert a {} egy Python-szótárt inicializál, nem pedig egy Python-készletet.

py_set2 = {}
type(py_set2)

# Output
dict

Ismét meghívhatja a type() függvényt, hogy ellenőrizze, hogy a py_set szótár-e (dict).

#2. A set() függvény használata

Ha inicializálni szeretne egy üres halmazt, majd elemeket szeretne hozzáadni hozzá, akkor ezt a set() függvény segítségével teheti meg.

py_set3 = set()
type(py_set3)

# Output
set

#3. Más iterálható elemek készletbe öntése

A halmazok létrehozásának másik módja az, hogy más iterálható elemeket, például listákat és sorokat készletekbe önt a set(iterable) használatával.

py_list = ['Python','C','C++','JavaScript','C']
py_set4 = set(py_list)
print(py_set4)
# {'C++', 'C', 'JavaScript', 'Python'} # repeating element 'C' removed
type(py_set4)
# set

A fenti példában a py_list kétszer tartalmazza a „C” betűt. De a py_set4-ben a „C” csak egyszer jelenik meg, mivel a halmaz különálló elemek gyűjteménye. Ezt a készletbe öntési technikát gyakran használják a Python-listák másolatainak eltávolítására.

  Harmadik féltől származó App Store-ok telepítése Androidra

Hogyan adjunk elemeket egy Python-készlethez

Kezdjük egy üres py_set készlet létrehozásával, és dolgozzunk vele az oktatóanyag hátralévő részében.

py_set = set()
len(py_set) # returns the length of a set
# Output
0

#1. Az .add() metódus használatával

Ha elemeket szeretne hozzáadni egy halmazhoz, használhatja az .add() metódust. set.add(elem) elemet ad a halmazhoz.

Az egyértelműség kedvéért elemeket adunk a Python-készlethez, és minden lépésnél kinyomtatjuk a készletet.

▶️ Adjuk hozzá a ‘Python’ karakterláncot elemként a py_sethez.

py_set.add('Python')
print(py_set)

# Output
{'Python'}

Ezután egy másik elemet adunk hozzá.

py_set.add('C++')
print(py_set)

# Output
{'Python', 'C++'}

Fontos megérteni, hogy az .add() metódus csak akkor ad hozzá egy elemet a halmazhoz, ha az még nincs jelen. Ha a készlet már tartalmazza a hozzáadni kívánt elemet, a hozzáadási műveletnek nincs hatása.

Ennek ellenőrzéséhez próbáljuk meg hozzáadni a „C++”-t a py_set-hez.

py_set.add('C++')
print(py_set)

# Output
{'Python', 'C++'}

A halmaz ‘C++’-t tartalmaz, így az add műveletnek nincs hatása.

▶️ Adjunk hozzá még néhány elemet a készlethez.

py_set.add('C')
print(py_set)
py_set.add('JavaScript')
print(py_set)
py_set.add('Rust')
print(py_set)

# Output
{'Python', 'C++', 'C'}
{'JavaScript', 'Python', 'C++', 'C'}
{'Rust', 'JavaScript', 'Python', 'C++', 'C'}

#2. Az .update() metódus használata

Eddig azt láttuk, hogyan lehet elemeket hozzáadni a meglévő halmazhoz – egyenként.

Mi a teendő, ha egynél több elemet szeretne hozzáadni egy elemsorozathoz?

Ezt megteheti az .update() metódussal a set.update(collection) szintaxissal, hogy a gyűjteményben lévő elemeket hozzáadja egy halmazhoz. A gyűjtemény lehet lista, sor, szótár stb.

py_set.update(['Julia','Ruby','Scala','Java'])
print(py_set)

# Output
{'C', 'C++', 'Java', 'JavaScript', 'Julia', 'Python', 'Ruby', 'Rust', 'Scala'}

Ez a módszer akkor hasznos, ha elemgyűjteményt szeretne hozzáadni egy halmazhoz anélkül, hogy másik objektumot hozna létre a memóriában.

A következő részben megtudjuk, hogyan távolíthatunk el elemeket egy halmazból.

Hogyan távolíthatunk el elemeket a Python készletből

Tekintsük a következő halmazt (py_set a frissítési művelet előtt).

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}

#1. A .pop() metódus használata

A set.pop() véletlenszerűen eltávolít egy elemet a halmazból, és visszaadja. Hívjuk meg a pop metódust a py_set-en, és nézzük meg, mit ad vissza.

py_set.pop()

# Output
'Rust'

Ezúttal a .pop() metódus hívása a „Rust” karakterláncot adta vissza.

Megjegyzés: Mivel a .pop() metódus véletlenszerűen ad vissza egy elemet, a végén lévő kód futtatásakor akár egy másik elemet is kaphat.

Amikor megvizsgáljuk a halmazt, a „rozsda” már nincs jelen a készletben.

print(py_set)

# Output
{'JavaScript', 'Python', 'C++', 'C'}

#2. A .remove() és a discard() metódusok használata

A gyakorlatban érdemes lehet bizonyos elemeket eltávolítani a készletből. Ehhez használhatja a .remove() és .discard() metódusokat.

set.remove(elem) eltávolítja az elemeket a halmazból.

py_set.remove('C')
print(py_set)

# Output
{'JavaScript', 'Python', 'C++'}

Ha megpróbálunk eltávolítani egy olyan elemet, amely nem szerepel a készletben, KeyError-ba futunk.

py_set.remove('Scala')

# Output
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-58-a1abab3a8892> in <module>()
----> 1 py_set.remove('Scala')

KeyError: 'Scala'

Nézzük meg újra a py_set it. Most három elemünk van.

print(py_set)

# Output
{'JavaScript', 'Python', 'C++'}

A set.discard(element) szintaxis esetén a .discard() metódus is eltávolít elemeket a halmazból.

py_set.discard('C++')
print(py_set)

# Output
{'JavaScript', 'Python'}

Azonban abban különbözik a .remove() metódustól, hogy nem okoz KeyError-t, amikor egy nem jelen lévő elemet próbálunk eltávolítani.

Ha a .discard() metódussal megpróbáljuk eltávolítani a ‘Scala’-t (ami nem létezik) a listáról, akkor nem látunk hibát.

py_set.discard('Scala') #no error!
print(py_set)

# Output
{'JavaScript', 'Python'}

Hogyan lehet elérni a Python készlet elemeit

Eddig megtanultuk, hogyan adhatunk hozzá és távolíthatunk el elemeket Python-készletekből. Azonban még nem láttuk, hogyan lehet hozzáférni egy készlet egyes elemeihez.

  Mi az a hálózati szippantó és mire használható?

Mivel egy halmaz rendezetlen gyűjtemény, nem indexelhető. Ezért, ha egy halmaz elemeit az index segítségével próbálja elérni, az ábrán látható módon hibába ütközik.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}

print(py_set[0])

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-0329274f4580> in <module>()
----> 1 print(py_set[0])

TypeError: 'set' object is not subscriptable

Tehát hogyan lehet hozzáférni egy készlet elemeihez?

Ennek két általános módja van:

  • Lapozzon át a készleten, és érje el az egyes elemeket
  • Ellenőrizze, hogy egy adott elem tagja-e a halmaznak

▶️ Lapozzon át a készleten, és érje el az elemeket a for hurok segítségével.

for elt in py_set:
  print(elt)

# Output
C++
JavaScript
Python
Rust
C

A gyakorlatban érdemes ellenőrizni, hogy egy adott elem jelen van-e a halmazban az in operátor segítségével.

Megjegyzés: az elem a halmazban igazat ad vissza, ha az elem jelen van a halmazban; egyébként False-t ad vissza.

Ebben a példában a py_set tartalmazza a ‘C++’-t, és nem tartalmazza a’ Julia’-t, az in operátor pedig igaz, illetve hamis értéket ad vissza.

'C++' in py_set
# True
'Julia' in py_set
# False

Hogyan találjuk meg a Python készlet hosszát

Amint korábban láttuk, a len() függvény segítségével lekérheti a halmazban lévő elemek számát.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}
len(py_set)

# Output: 5

Python készlet törlése

Egy halmaz törléséhez az összes elem eltávolításával a .clear() metódus használható.

Hívjuk meg a .clear() metódust a py_set-en.

py_set.clear()

Ha megpróbálja kinyomtatni, akkor a set() üzenet jelenik meg – jelezve, hogy a készlet üres. A len() függvényt is meghívhatja annak ellenőrzésére, hogy a halmaz hossza nulla.

print(py_set)
# set()
print(len(py_set))
# 0

Eddig megtanultuk, hogyan kell alapvető CRUD-műveleteket végrehajtani Python-készleteken:

  • Létrehozás: A set() függvény használatával írja be a castingot és az inicializálást
  • Olvassa el: A készlet elemeinek elérése hurkok és operátor segítségével a tagság teszteléséhez
  • Frissítés: Elemek hozzáadása, eltávolítása a készletekből és készletek frissítése
  • Törlés: Egy halmaz törlése az összes elem eltávolításával

Közös halmazműveletek, a Python kóddal magyarázva

A Python-készletek lehetővé teszik az alapvető halmazműveletek végrehajtását is. Ebben a részben róluk tanulunk.

#1. Halmazok Uniója Pythonban

A halmazelméletben a két halmaz uniója a két halmaz legalább egyikében lévő összes elem halmaza. Ha két halmaz van, A és B, akkor az unió olyan elemeket tartalmaz, amelyek csak A-ban, csak B-ben, valamint A-ban és B-ben egyaránt jelen vannak.

A halmazok uniójának megtalálásához használhatja a | operátort vagy az .union() metódust a következő szintaxissal: setA.union(setB).

setA = {1,3,5,7,9}
setB = {2,4,6,8,9}

print(setA | setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

setA.union(setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

A halmazegyesítés kommutatív művelet; tehát az AUB ugyanaz, mint a BU A. Ellenőrizzük ezt úgy, hogy felcseréljük a setA és setB pozícióit az .union() metódushívásban.

setB.union(setA)

# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

#2. Halmazok metszéspontja Pythonban

Egy másik közös halmazművelet két halmaz, A és B metszéspontja. A halmaz metszéspontja egy olyan halmazt ad vissza, amely tartalmazza az A-ban és B-ben egyaránt megtalálható összes elemet.

A metszéspont kiszámításához használhatja a & operátort vagy az .intersection() metódust, amint azt az alábbi kódrészletben ismertetjük.

print(setA & setB)

# Output
{9}

setA.intersection(setB)

# Output
{9}

Ebben a példában a 9. elem a setA-ban és a setB-ben is jelen van; tehát a metszethalmaz csak ezt az elemet tartalmazza.

  A Microsoft Teams értesítéseinek kikapcsolása

A halmazunióhoz hasonlóan a halmazmetszés is kommutatív művelet.

setB.intersection(setA)

# Output
{9}

#3. Állítsa be a különbséget Pythonban

Tetszőleges két halmaz esetén az egyesülés és a metszés segít megtalálni a mindkettőben és legalább az egyik halmazban jelen lévő elemeket. Másrészt a halmazkülönbség segít megtalálni azokat az elemeket, amelyek az egyik halmazban jelen vannak, de a másikban nem.

– setA.difference(setB) azoknak az elemeknek a halmazát adja meg, amelyek csak a halmazban vannak jelen, a setB-ben nem.

– setB.difference(setA) megadja azon elemek halmazát, amelyek csak a setB-ben vannak jelen, azA-ban nem.

print(setA - setB)

print(setB - setA)

# Output
{1, 3, 5, 7}
{8, 2, 4, 6}

Nyilvánvaló, hogy AB nem ugyanaz, mint BA, így a halmazkülönbség nem kommutatív művelet.

setA.difference(setB)
# {1, 3, 5, 7}

setB.difference(setA)
# {2, 4, 6, 8}

#4. Szimmetrikus halmazkülönbség a Pythonban

Míg a halmaz metszéspontja mindkét halmazban jelenlévő elemeket ad, a szimmetrikus halmazkülönbség a pontosan az egyik halmazban jelenlévő elemek halmazát adja vissza.

Tekintsük a következő példát.

setA = {1,3,5,7,10,12}
setB = {2,4,6,8,10,12}

A szimmetrikus különbséghalmaz kiszámításához használhatja a ^ operátort vagy a .symmetric_difference() metódust.

print(setA ^ setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

A 10 és 12 elemek mind azA, mind a B halmazban jelen vannak. Tehát nincsenek jelen a szimmetrikus különbség halmazban.

setA.symmetric_difference(setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

Mivel a szimmetrikus halmazkülönbség művelet az összes olyan elemet összegyűjti, amely a két halmaz közül pontosan az egyikben szerepel, az eredő halmaz az elemek gyűjtésének sorrendjétől függetlenül ugyanaz. Ezért a szimmetrikus halmazkülönbség kommutatív művelet.

setB.symmetric_difference(setA)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

#5. Részhalmazok és szuperhalmazok a Pythonban

A halmazelméletben a részhalmazok és a szuperhalmazok segítenek megérteni a két halmaz közötti kapcsolatot.

Adott két A és B halmaz, a B halmaz az A halmaz egy részhalmaza, ha a B halmaz összes eleme az A halmazban is jelen van. Az A halmaz pedig a B halmaz szuperhalmaza.

Tekintsük a két halmaz példáját: nyelvek és nyelvek_kiterjesztése.

languages = {'Python', 'JavaScript','C','C++'}
languages_extended = {'Python', 'JavaScript','C','C++','Rust','Go','Scala'}

A Pythonban az .issubset() metódussal ellenőrizheti, hogy egy adott halmaz egy másik halmaz részhalmaza-e.

setA.issubset(setB) értéke igaz, ha setA a setB részhalmaza; egyébként False-t ad vissza.

Ebben a példában a nyelvek a languages_extended részhalmaza.

languages.issubset(languages_extended)
# Output
True

Hasonlóképpen, az .issuperset() metódussal ellenőrizheti, hogy egy adott halmaz egy másik halmaz szuperhalmaza-e.

setA.issuperset(setB) értéke igaz, ha setA a setB szuperhalmaza; egyébként False-t ad vissza.

languages_extended.issuperset(languages)
# Output
True

Mivel a languages_extended a nyelvek szuperhalmaza, a languages_extended.issuperset(languages) True értéket ad vissza, amint az fent látható.

Következtetés

Remélem, ez az oktatóanyag segített megérteni a Python-készletek működését, a CRUD-műveletek beállítási módszereit és a közös halmazműveleteket. Következő lépésként megpróbálhatja használni őket a Python-projektekben.

Megnézheti a többi részletes Python-útmutatót is. Boldog tanulást!