Python har innebygget støtte for sett og settoperasjoner. Vi trenger dermed ikke importere noen funksjoner fra Pandas eller Numpy for å gjøre dette. Først lager vi noen sett med data, og så utfører vi noen operasjoner mot disse. Sett A er noen tippeligalag, mens sett B er lag fra Agderfylkene.
from IPython.display import display, Math
# Sett skrives med kommaseparerte verdier mellom { og }. Merk at { og } også brukes i dictionaries,
# men da har man også kolon for å skille nøkkel fra verdi, slik: {'key': 'value', 'key2': 'value2' ...}.
A = {'Rosenborg', 'Brann', 'Start', 'Sogndal', 'Viking'}
B = {'Start', 'Jerv', 'Vindbjart'}
# A|B betyr A union B. Kan også skrives A.union(B). Dvs. alle lagene. Se forklaring lenger nede.
Omega = A|B
# Vis Omega:
Omega
Vi kan enkelt sjekke om en verdi finnes i et sett. Da bruker vi "in"-operatoren i Python. Vi kan også skrive "not in" for motsatt operasjon.
# Hvis x er element i A
if 'Viking' in A:
print('Viking er et tippeligalag:')
display(Math(r'Viking \in A'))
# Hvis x ikke er element i B
if 'Viking' not in B:
print('Viking er ikke et lag fra Agderfylkene:')
display(Math(r'Viking \notin B'))
Union og snitt er også innebyggede operasjoner. Man skriver to settvariabler, med en operator i mellom. Dette er "|" for union, og "&" for snitt. Man kan alternativt bruke A.union(B) eller A.intersection(B).
# Union. A|B eller A.union(B):
display(Math(r'A \cup B:'), A|B)
print('---')
# Snitt. A&B eller A.intersection(B):
display(Math(r'A \cap B:'), A&B)
print('---')
# Differanse. A-B eller A.differense(B):
display(Math(r'A \setminus B:'), A-B)
Komplement er ikke tilgjengelig som noen operator, men hvis vi først tar union av alle verdiene, kan vi ta differanse med et av settene.
# Komplement
display(Math(r'A^C:'), Omega-A)
Det er mulig å kombinere operasjonene vi har sett på her. Eksempel:
C = Omega-(A&B) # C = Omega uten snitt av A og B
print('Er Jerv element i', C, '?')
# Element-operasjon:
'Jerv' in C
Binomialkoeffisient kan vi regne ut ved hjelp av "comb"-funksjonen i Scipy. Dette er det du finner som nCr (n, choose r) på kalkulatoren. Funksjonen kan enten ta tall for n og r, eller lister. Her bruker vi tall. Vi spesifiserer også exact=True, slik at vi får et eksakt heltall som svar.
from scipy.misc import comb
comb(104, 7, exact=True)
Multinomialkoeffisienten er ikke like rett-frem ved bruk av de pakkene vi har til rådighet. Vi kan likevel implementere den ved hjelp av binomialkoeffisienten. Se Nyberg sin bok for mer om multinomialkoeffisienten.
def multinomial(n, ks):
svar = comb(n, ks[0], exact=True) # Indekser i Python starter på 0. Binomial(n, k_1)
# Trekker fra k-verdier fra n (k_1, k_2, ... k_n-2)
# og bruker comb ved hver iterasjon for å multiplisere med tidligere svar.
for m in range(1, len(ks)-1):
n -= ks[m-1]
svar *= comb(n, ks[m], exact=True)
return svar
# Test av funksjonen
multinomial(31, [8,2,7,8,6])