A Python biztosít egy beépített adattípust, a set-et, amely a halmazokat kezeli.
A típushalmaz nem duplikált elemek (nem azonos értékű elemek, egyedi elemek) gyűjteménye, és olyan halmazműveleteket végezhet, mint az unióhalmaz, a szorzathalmaz és a különbséghalmaz.
Ebben a szakaszban a halmaz típusú halmazműveletek alapvető műveleteit ismertetjük mintakóddal.
- Készletobjektumok létrehozása:
{}
,set()
- halmazbefogadási jelölés
- A halmaz elemeinek száma:
len()
- Elem hozzáadása egy készlethez:
add()
- Elem eltávolítása egy halmazból:
discard()
,remove()
,pop()
,clear()
- Wasset (egyesülés, egyesülés):|operátor,
union()
- Termékkészletek (közös alkatrészek, metszetek, kereszteződések):& operátor,
intersection()
- relatív komplement:-üzemeltető,
difference()
- szimmetriakülönbség-készlet:^ operátor,
symmetric_difference()
- részhalmaz vagy sem:<= operátor,
issubset()
- Felső készlet vagy sem:>= operátor,
issuperset()
- Annak meghatározása, hogy kölcsönösen prímek-e vagy sem:
isdisjoint()
A set típus egy változtatható típus, amely elemeket adhat hozzá és törölhet, és létezik egy frozenset típus is, amely ugyanazzal a set művelettel és egyéb metódusokkal rendelkezik, mint a set típus, de megváltoztathatatlan (nem módosítható elemek hozzáadásával, törlésével vagy más módon történő módosításával).
- Set objektum létrehozása:: {}, set()
- halmazbefogadási jelölés
- A halmaz elemeinek száma: len()
- Elem hozzáadása egy készlethez: add()
- Elem eltávolítása egy halmazból: discard(),remove(),pop(),clear()
- Wasset (egyesülés, egyesülés): |operátor, union()
- Termékkészletek (közös alkatrészek, metszetek, kereszteződések): & operátor, intersection()
- relatív komplement: -üzemeltető, difference()
- szimmetriakülönbség-készlet: ^ operátor, symmetric_difference()
- részhalmaz vagy sem: <= operátor, issubset()
- Felső készlet vagy sem: >= operátor, issuperset()
- Annak meghatározása, hogy kölcsönösen prímek-e vagy sem: isdisjoint()
Set objektum létrehozása:: {}, set()
Hullámzárójelek által generált {}
A set típusú objektumok úgy hozhatók létre, hogy az elemeket {} zárójelek közé zárjuk.
Ha vannak duplikált értékek, azokat a rendszer figyelmen kívül hagyja, és csak az egyedi értékek maradnak elemként.
s = {1, 2, 2, 3, 1, 4}
print(s)
print(type(s))
# {1, 2, 3, 4}
# <class 'set'>
Lehetőség van különböző típusok elemként való használatára. A frissíthető objektumok, például a listatípusok azonban nem regisztrálhatók. Tuplik engedélyezettek.
Továbbá, mivel a halmaz típusok rendezetlenek, a generálásuk sorrendje nem kerül tárolásra.
s = {1.23, 'abc', (0, 1, 2), 'abc'}
print(s)
# {(0, 1, 2), 1.23, 'abc'}
# s = {[0, 1, 2]}
# TypeError: unhashable type: 'list'
A különböző típusok, mint például az int és a float, duplikátumnak tekinthetők, ha értékeik egyenértékűek.
s = {100, 100.0}
print(s)
# {100}
Mivel az üres zárójel {} szótártípusnak minősül, egy üres halmaz típusú objektum (üres halmaz) a következőkben ismertetett konstruktorral hozható létre.
s = {}
print(s)
print(type(s))
# {}
# <class 'dict'>
A set() konstruktor által generált
A set típusú objektumok a set() konstruktorral is létrehozhatók.
Egy iterálható objektum, például egy lista vagy egy tuple argumentumként történő megadása egy olyan halmazobjektumot generál, amelynek elemei csak egyedi értékek, a duplikált elemek kizárásával.
l = [1, 2, 2, 3, 1, 4]
print(l)
print(type(l))
# [1, 2, 2, 3, 1, 4]
# <class 'list'>
s_l = set(l)
print(s_l)
print(type(s_l))
# {1, 2, 3, 4}
# <class 'set'>
A megváltoztathatatlan frozenset típusok a frozenset() konstruktorral hozhatók létre.
fs_l = frozenset(l)
print(fs_l)
print(type(fs_l))
# frozenset({1, 2, 3, 4})
# <class 'frozenset'>
Ha az argumentumot elhagyja, egy üres halmaz típusú objektum (üres halmaz) jön létre.
s = set()
print(s)
print(type(s))
# set()
# <class 'set'>
A duplikált elemek eltávolíthatók egy listából vagy tuple-ból a set() segítségével, de az eredeti lista sorrendje nem marad meg.
Ha egy halmaz típust listává vagy tuplévá szeretne konvertálni, használja a list(),tuple() parancsot.
l = [2, 2, 3, 1, 3, 4]
l_unique = list(set(l))
print(l_unique)
# [1, 2, 3, 4]
A duplikált elemek eltávolításáról a sorrend megőrzése mellett, a csak a duplikált elemek kivonásáról és a duplikált elemek feldolgozásáról kétdimenziós tömbben (listák listája) a következő cikkben olvashat.
halmazbefogadási jelölés
A listakövetelmények mellett vannak halmazkövetelmények is. Egyszerűen csak cseréljük ki a szögletes zárójeleket [] szögletes zárójelekre {} a listakövetelményekben.
s = {i**2 for i in range(5)}
print(s)
# {0, 1, 4, 9, 16}
A következő cikkben további információkat talál a listamegértés jelöléséről.
A halmaz elemeinek száma: len()
A halmaz elemeinek számát a len() beépített függvénnyel kaphatjuk meg.
s = {1, 2, 2, 3, 1, 4}
print(s)
print(len(s))
# {1, 2, 3, 4}
# 4
Ha meg szeretné számolni az egyes listák azon elemeinek számát, amelyekben duplikált értékű elemek vannak, stb., lásd a következő cikket.
Elem hozzáadása egy készlethez: add()
Egy elem hozzáadásához egy halmazhoz az add() metódust használjuk.
s = {0, 1, 2}
s.add(3)
print(s)
# {0, 1, 2, 3}
Elem eltávolítása egy halmazból: discard(),remove(),pop(),clear()
Egy elem eltávolításához egy halmazból a discard(), remove(), pop() és clear() metódusokat használhatjuk.
A discard() metódus törli az argumentumban megadott elemet. Ha olyan érték van megadva, amely nem létezik a halmazban, akkor nem történik semmi.
s = {0, 1, 2}
s.discard(1)
print(s)
# {0, 2}
s = {0, 1, 2}
s.discard(10)
print(s)
# {0, 1, 2}
A remove() metódus szintén eltávolítja az argumentumban megadott elemet, de egy KeyError hibát ad vissza, ha olyan értéket ad meg, amely nem létezik a halmazban.
s = {0, 1, 2}
s.remove(1)
print(s)
# {0, 2}
# s = {0, 1, 2}
# s.remove(10)
# KeyError: 10
A pop() metódus eltávolítja az elemeket egy halmazból, és visszaadja az értéküket. Nem lehet kiválasztani, hogy mely értékek kerüljenek eltávolításra. Az üres halmaz KeyError hibát eredményez.
s = {2, 1, 0}
v = s.pop()
print(s)
print(v)
# {1, 2}
# 0
s = {2, 1, 0}
print(s.pop())
# 0
print(s.pop())
# 1
print(s.pop())
# 2
# print(s.pop())
# KeyError: 'pop from an empty set'
A clear() metódus eltávolítja az összes elemet, és üressé teszi a halmazt.
s = {0, 1, 2}
s.clear()
print(s)
# set()
Wasset (egyesülés, egyesülés): |operátor, union()
Az unióhalmaz (egyesülés, unió) a | operátorral vagy az union() metódussal kapható.
s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}
s_union = s1 | s2
print(s_union)
# {0, 1, 2, 3}
s_union = s1.union(s2)
print(s_union)
# {0, 1, 2, 3}
Egy módszerhez több argumentum is megadható. A set típuson kívül a set() segítségével set típusba konvertálható listák és tuplik is megadhatók argumentumként. Ugyanez vonatkozik a későbbi operátorokra és metódusokra is.
s_union = s1.union(s2, s3)
print(s_union)
# {0, 1, 2, 3, 4}
s_union = s1.union(s2, [5, 6, 5, 7, 5])
print(s_union)
# {0, 1, 2, 3, 5, 6, 7}
Termékkészletek (közös alkatrészek, metszetek, kereszteződések): & operátor, intersection()
A termékhalmaz (közös rész, metszet és metszéspont) az & operátorral vagy az intersection() metódussal kapható.
s_intersection = s1 & s2
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2)
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2, s3)
print(s_intersection)
# {2}
relatív komplement: -üzemeltető, difference()
A különbséghalmaz a – operátorral vagy a difference() módszerrel kapható.
s_difference = s1 - s2
print(s_difference)
# {0}
s_difference = s1.difference(s2)
print(s_difference)
# {0}
s_difference = s1.difference(s2, s3)
print(s_difference)
# {0}
szimmetriakülönbség-készlet: ^ operátor, symmetric_difference()
A szimmetrikus különbséghalmaz (a kettő közül csak az egyikben szereplő elemek halmaza) a ^ operátorral vagy a symmetric_difference() paranccsal kapható meg.
A logikai műveletekben a kizárólagos diszjunkcióval (XOR) egyenértékű.
s_symmetric_difference = s1 ^ s2
print(s_symmetric_difference)
# {0, 3}
s_symmetric_difference = s1.symmetric_difference(s2)
print(s_symmetric_difference)
# {0, 3}
részhalmaz vagy sem: <= operátor, issubset()
Annak megállapításához, hogy egy halmaz egy másik halmaz részhalmaza-e, használja a <= operátort vagy az issubset() metódust.
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s1 <= s2)
# True
print(s1.issubset(s2))
# True
A <= operátor és az issubset() metódus is igazat ad vissza egyenértékű halmazok esetén.
Annak megállapításához, hogy igaz részhalmazról van-e szó, használja a <= operátort, amely egyenértékű halmazok esetén hamis értéket ad vissza.
print(s1 <= s1)
# True
print(s1.issubset(s1))
# True
print(s1 < s1)
# False
Felső készlet vagy sem: >= operátor, issuperset()
Annak meghatározásához, hogy egy halmaz egy másik halmaz szuperhalmaza-e, használja a >= operátort vagy az issuperset() függvényt.
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s2 >= s1)
# True
print(s2.issuperset(s1))
# True
A >= operátor és az issuperset() metódus is igazat ad vissza egyenértékű halmazok esetén.
Annak megállapításához, hogy igaz szuperhalmazról van-e szó, használjuk a >= operátort, amely egyenértékű halmazok esetén hamis értéket ad vissza.
print(s1 >= s1)
# True
print(s1.issuperset(s1))
# True
print(s1 > s1)
# False
Annak meghatározása, hogy kölcsönösen prímek-e vagy sem: isdisjoint()
Annak megállapításához, hogy két halmaz prím-e egymáshoz képest, az isdisjoint() metódust használjuk.
s1 = {0, 1}
s2 = {1, 2}
s3 = {2, 3}
print(s1.isdisjoint(s2))
# False
print(s1.isdisjoint(s3))
# True