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.

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

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.

  A Google-táblázatok adatainak exportálása JSON-ba és XML-be

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.

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 margók szabályozása a Google Dokumentumokban

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 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!