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