Python-code bij Verkiezingsalgoritme en restzetels

Je kunt de code ook als Python Notebook downloaden.

# Een theoretisch voorbeeld

import math

VERBOSE = 2  # Bij 2 worden ook de tussenresultaten getoond, bij 1 de invoer
KZ = 150     # Kamerzetels
K = 18000000 # Kiesgerechtigden
N =  2000000 # Niet opgekomen
O = 16000000 # Opkomst
X =   500000 # Ongeldige stemmen
B =   500000 # Blanco stemmen 
G = 15000000 # Geldige stemmen

print("Statistieken")
print("Kamerzetels:", KZ)
print("Kiesgerechtigden:", K)
print("Niet opgekomen:", N)
print("Opkomst:", K - N)
print("Ongeldige stemmen:", X)
print("Blanco stemmen:", B)
print("Geldige stemmen:", K - N - B - X)

S = [(10761000, "Partij A"),
(2862000, "Partij B"),
(1377000, "Partij C")]
sum = 0
V = []
R = []
for s in S:
    sum += s[0]
    V.append([0,0,s[0],s[1]])
KD = round(sum/KZ)
print("Kiesdeler:", KD)
zsum = 0
for v in V:
    v[1] = math.floor(v[2]/KD)
    zsum += v[1]
    if v[1] == 0:
        v[0] = 0
    else:
        v[0] = round(v[2]/(v[1]+1),2)
Vs = sorted(V, reverse = True)
cnt = 0
if VERBOSE > 0:
    for v in Vs:
        print(v)
while KZ-zsum > 0:
    v = Vs[0]
    zsum += 1
    v[1] = v[1] + 1
    v[0] = round(v[2]/v[1],2)
    cnt += 1
    if VERBOSE > 1:
        print(cnt, v)
    R.append(v[3])
    Vs = sorted(V, reverse = True)
U = []
for v in V:
    U.append((v[1],v[3]))
U.sort()
print("Restzetels:", len(R))
print("Toegewezen aan:", R)
print("Zetelverdeling:")
for i in range(len(U)):
    u = U[len(U)-i-1]
    if u[0] > 0:
        print(u[1], ":", u[0])

 

# Verkiezingen 2017 en 2021

import math

VERBOSE = 0  # Bij 2 worden ook de tussenresultaten getoond, bij 1 de invoer

J = 2021

if J == 2017:
    KZ = 150     # Kamerzetels
    K = 12950685 # Kiesgerechtigden
    N = 2387229  # Niet opgekomen
    O = 10563456 # Opkomst
    X = 31539    # Ongeldige stemmen
    B = 15876    # Blanco stemmen 
    G = 10516041 # Geldige stemmen
if J == 2021:
    KZ = 150     # Kamerzetels
    K = 13187770 # Kiesgerechtigden
    N = 2725093  # Niet opgekomen
    O = 10462677 # Opkomst
    X = 22652    # Ongeldige stemmen
    B = 17173    # Blanco stemmen 
    G = 10422852 # Geldige stemmen

print("Jaar: ", J)
print("Statistieken")
print("Kamerzetels:", KZ)
print("Kiesgerechtigden:", K)
print("Niet opgekomen:", N)
print("Opkomst:", K - N)
print("Ongeldige stemmen:", X)
print("Blanco stemmen:", B)
print("Geldige stemmen:", K - N - B - X)

S2017 = [(2238351, "VVD"),
(1372941, "PVV"),
(1301796, "CDA"),
(1285819, "D66"),
(959600, "GroenLinks"),
(955633, "SP"),
(599699, "PvdA"),
(356271, "ChristenUnie"),
(335214, "PvdD"),
(327131, "50Plus"),
(218950, "SGP"),
(216147, "DENK"),
(187162, "FvD"),
(38209, "VoorNederland"),
(35478, "Piratenpartij"),
(28700, "Artikel 1"),
(14362, "Nieuwe Wegen"),
(12570, "OndernemersPartij"),
(6858, "Lokaal in de Kamer"),
(6025, "Niet Stemmers"),
(5221, "De Burger Beweging"),
(4945, "GeenPeil"),
(3099, "Jezus Leeft"),
(2938, "Vrijzinnige Partij"),
(1492, "Libertarische Partij"),
(726, "MenS"),
(527, "StemNL"),
(177, "Vrije Democratische Partij")]
S2021 = [(2279130, "VVD"),
(1565861, "D66"),
(1124482, "PVV"),
(990601, "CDA"),
(623371, "SP"),
(597192, "PvdA"),
(537308, "GroenLinks"),
(523083, "FvD"),
(399750, "PvdD"),
(351275, "ChristenUnie"),
(252480, "Volt"),
(246620, "JA21"),
(215249, "SGP"),
(211237, "DENK"),
(106702, "50Plus"),
(104319, "BBB"),
(87238, "Bij1"),
(40731, "Code Oranje"),
(33834, "Nida"),
(30328, "Splinter"),
(22816, "Piratenpartij"),
(15297, "Jong"),
(13198, "Trots"),
(9264, "Lijst Henk Krol"),
(8657, "NLBeter"),
(8277, "Blanco Lijst"),
(5546, "LP"),
(5449, "Oprecht"),
(5015, "Jezus Leeft"),
(3744, "DFP"),
(1880, "U-Buntu Connected Front"),
(942, "Vrij en Sociaal Nederland"),
(804, "Partij van de Eenheid"),
(553, "Wij zijn Nederland"),
(255, "Partij voor de Republiek"),
(245, "Modern Nederland"),
(119, "De Groenen")]
S = S2021
sum = 0
V = []
R = []
for s in S:
    sum += s[0]
    V.append([0,0,s[0],s[1]])
KD = round(sum/KZ)
print("Kiesdeler:", KD)
zsum = 0
for v in V:
    v[1] = math.floor(v[2]/KD)
    zsum += v[1]
    if v[1] == 0:
        v[0] = 0
    else:
        v[0] = -round(v[2]/(v[1]+1),2)
V.sort()
cnt = 0
if VERBOSE > 0:
    for v in V:
        print(v)
while KZ-zsum > 0:
    v = V[0]
    zsum += 1
    v[1] = v[1] + 1
    v[0] = -round(v[2]/(v[1]+1),2)
    cnt += 1
    if VERBOSE > 1:
        print(cnt, v)
    R.append(v[3])
    V.sort()
U = []
for v in V:
    U.append((v[1],v[3]))
U.sort()
print("Restzetels:", len(R))
print("Toegewezen aan:", R)
print("Zetelverdeling:")
for i in range(len(U)):
    u = U[len(U)-i-1]
    if u[0] > 0:
        print(u[1], ":", u[0])
for s in S:
    print("{} & {} & {} & {} & {} \\\\".format(s[1],s[0],round(s[0]/KD,3), s[0]//KD, round(s[0]/KD)))