Zoeken…


Syntaxis

  • empty_set = set () # initialiseer een lege set
  • literal_set = {'foo', 'bar', 'baz'} # construeer een set met 3 strings erin
  • set_from_list = set (['foo', 'bar', 'baz']) # roep de set-functie aan voor een nieuwe set
  • set_from_iter = set (x voor x in bereik (30)) # gebruik willekeurige iterables om een set te maken
  • set_from_iter = {x voor x in [random.randint (0,10) voor i in bereik (10)]} # alternatieve notatie

Opmerkingen

Sets zijn ongeordend en hebben een zeer snelle opzoektijd (afgeschreven O (1) als u technisch wilt worden). Het is geweldig om te gebruiken wanneer je een verzameling dingen hebt, de volgorde doet er niet toe en je zult items veel op naam opzoeken. Als het zinvoller is om items op te zoeken op basis van een indexnummer, kunt u overwegen een lijst te gebruiken. Als volgorde belangrijk is, overweeg dan ook een lijst.

Sets kunnen worden gewijzigd en kunnen dus niet worden gehasht, dus u kunt ze niet gebruiken als woordenboeksleutels of ze in andere sets plaatsen, of ergens anders waar hashable-typen vereist zijn. In dergelijke gevallen kunt u een onveranderlijk frozenset .

De elementen van een set moeten hashable zijn . Dit betekent dat ze een correcte __hash__ methode hebben, die consistent is met __eq__ . Over het algemeen zijn muteerbare typen zoals list of set niet hashable en kunnen ze niet in een set worden geplaatst. Als u dit probleem tegenkomt, kunt u overwegen dict en onveranderlijke sleutels te gebruiken.

Download de unieke elementen van een lijst

Stel dat u een lijst met restaurants hebt - misschien leest u deze uit een bestand. Je geeft om de unieke restaurants in de lijst. De beste manier om de unieke elementen uit een lijst te krijgen, is door er een set van te maken:

restaurants = ["McDonald's", "Burger King", "McDonald's", "Chicken Chicken"]
unique_restaurants = set(restaurants)
print(unique_restaurants)
# prints {'Chicken Chicken', "McDonald's", 'Burger King'}

Merk op dat de set niet in dezelfde volgorde staat als de originele lijst; dat komt omdat sets niet geordend zijn , net als dict s.

Dit kan gemakkelijk weer worden omgezet in een List met Python's ingebouwde list functie, het geven van een andere lijst, dat is dezelfde lijst als het origineel, maar zonder duplicaten:

list(unique_restaurants)
# ['Chicken Chicken', "McDonald's", 'Burger King']

Het is ook gebruikelijk om dit als één regel te zien:

# Removes all duplicates and returns another list
list(set(restaurants))

Nu kunnen alle bewerkingen die op de oorspronkelijke lijst kunnen worden uitgevoerd, opnieuw worden uitgevoerd.

Bewerkingen op sets

met andere sets

# Intersection    
{1, 2, 3, 4, 5}.intersection({3, 4, 5, 6})  # {3, 4, 5}
{1, 2, 3, 4, 5} & {3, 4, 5, 6}              # {3, 4, 5}

# Union
{1, 2, 3, 4, 5}.union({3, 4, 5, 6})  # {1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5} | {3, 4, 5, 6}       # {1, 2, 3, 4, 5, 6}

# Difference
{1, 2, 3, 4}.difference({2, 3, 5})  # {1, 4}
{1, 2, 3, 4} - {2, 3, 5}            # {1, 4}

# Symmetric difference with
{1, 2, 3, 4}.symmetric_difference({2, 3, 5})  # {1, 4, 5}
{1, 2, 3, 4} ^ {2, 3, 5}                      # {1, 4, 5}

# Superset check
{1, 2}.issuperset({1, 2, 3})  # False
{1, 2} >= {1, 2, 3}           # False

# Subset check
{1, 2}.issubset({1, 2, 3})  # True
{1, 2} <= {1, 2, 3}         # True

# Disjoint check
{1, 2}.isdisjoint({3, 4})  # True
{1, 2}.isdisjoint({1, 4})  # False

met enkele elementen

# Existence check
2 in {1,2,3}      # True
4 in {1,2,3}      # False
4 not in {1,2,3}  # True

# Add and Remove
s = {1,2,3}
s.add(4)        # s == {1,2,3,4}

s.discard(3)    # s == {1,2,4}
s.discard(5)    # s == {1,2,4}

s.remove(2)     # s == {1,4}
s.remove(2)     # KeyError!

Setbewerkingen retourneren nieuwe sets, maar hebben de bijbehorende in-place-versies:

methode werking ter plaatse in-place methode
unie s | = t bijwerken
kruispunt s & = t intersection_update
verschil s - = t difference_update
symmetric_difference s ^ = t symmetric_difference_update

Bijvoorbeeld:

s = {1, 2}
s.update({3, 4})   # s == {1, 2, 3, 4}

Sets versus multisets

Sets zijn ongeordende verzamelingen van verschillende elementen. Maar soms willen we werken met ongeordende collecties van elementen die niet noodzakelijkerwijs onderscheiden zijn en de veelvoud van de elementen bijhouden.

Beschouw dit voorbeeld:

>>> setA = {'a','b','b','c'}
>>> setA
set(['a', 'c', 'b'])

Door de strings 'a' , 'b' , 'b' , 'c' op te slaan in een ingestelde gegevensstructuur, zijn we de informatie kwijt over het feit dat 'b' twee keer voorkomt. Natuurlijk zou het opslaan van de elementen in een lijst deze informatie behouden

>>> listA = ['a','b','b','c']
>>> listA
['a', 'b', 'b', 'c']

maar een lijst datastructuur introduceert een extra onnodige bestelling die onze berekeningen zal vertragen.

Voor het implementeren van multisets biedt Python de klasse Counter uit de collections (vanaf versie 2.7):

Python 2.x 2.7
>>> from collections import Counter
>>> counterA = Counter(['a','b','b','c'])
>>> counterA
Counter({'b': 2, 'a': 1, 'c': 1})

Counter is een woordenboek waarin elementen worden opgeslagen als woordenboeksleutels en hun tellingen worden opgeslagen als woordenboekwaarden. En zoals alle woordenboeken, is het een ongeordende verzameling.

Stel bewerkingen in met behulp van methoden en ingebouwde modules

We definiëren twee sets a en b

>>> a = {1, 2, 2, 3, 4}
>>> b = {3, 3, 4, 4, 5}

OPMERKING: {1} maakt een set van één element, maar {} maakt een leeg dict . De juiste manier om een lege set te maken is set() .

kruispunt

a.intersection(b) retourneert een nieuwe set met elementen in zowel a als b

>>> a.intersection(b)
{3, 4}

Unie

a.union(b) retourneert een nieuwe set met elementen aanwezig in a en b

>>> a.union(b)
{1, 2, 3, 4, 5}

Verschil

a.difference(b) geeft een nieuwe set terug met elementen aanwezig in a maar niet in b

>>> a.difference(b)
{1, 2}
>>> b.difference(a)
{5}

Symmetrisch verschil

a.symmetric_difference(b) retourneert een nieuwe set met elementen aanwezig in a of b maar niet in beide

>>> a.symmetric_difference(b)
{1, 2, 5}
>>> b.symmetric_difference(a)
{1, 2, 5}

OPMERKING : a.symmetric_difference(b) == b.symmetric_difference(a)

Subset en superset

c.issubset(a) test of elk element van c deel c.issubset(a) van a .

a.issuperset(c) test of elk element van c zich in a .

>>> c = {1, 2}
>>> c.issubset(a)
True
>>> a.issuperset(c)
True

De laatste operaties hebben gelijkwaardige operatoren zoals hieronder getoond:

Methode operator
a.intersection(b) a & b
a.union(b) a | b
a.difference(b) a - b
a.symmetric_difference(b) a ^ b
a.issubset(b) a <= b
a.issuperset(b) a >= b

Onsamenhangende sets

Sets a en d zijn onsamenhangend als er geen element in a ook in d en omgekeerd.

>>> d = {5, 6}
>>> a.isdisjoint(b) # {2, 3, 4} are in both sets
False
>>> a.isdisjoint(d)
True

# This is an equivalent check, but less efficient
>>> len(a & d) == 0
True

# This is even less efficient
>>> a & d == set()
True

Lidmaatschap testen

De ingebouwde in zoeken op trefwoorden voor occurances

>>> 1 in a
True
>>> 6 in a
False

Lengte

De ingebouwde len() functie retourneert het aantal elementen in de set

>>> len(a)
4
>>> len(b)
3

Set van sets

{{1,2}, {3,4}}

leidt tot:

TypeError: unhashable type: 'set'

Gebruik in plaats daarvan frozenset :

{frozenset({1, 2}), frozenset({3, 4})}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow