Hier ist das Python-Programm von Grok3. Hat noch keine 30 Zeilen. (mT)

DT, Montag, 24.02.2025, 04:29 (vor 302 Tagen) @ neptun3717 Views

Und wenn man noch das neue Verfahren mit den Erststimmen nach der Wahlrechtsreform einbauen möchte, dann braucht es noch einen Vorfilter:
https://www.bundeswahlleiterin.de/service/glossar/s/sitzverteilung.html#id-0

Das ganze ist ein zweistufiges, modifiziertes d'Hondtsches Höchstzahlverfahren und beseitigt Paradoxien, wie sie bei Hare-Niemeyer auftraten:
https://www.bundeswahlleiterin.de/service/glossar/s/sainte-lague-schepers.html


python
def sainte_lague_schepers(stimmen, sitze_gesamt):
"""
Berechnet die Sitzverteilung nach dem Sainte-Laguë/Schepers-Verfahren.

Args:
stimmen (dict): Dictionary mit Parteien als Schlüssel und Stimmen als Werte
sitze_gesamt (int): Gesamtzahl der zu verteilenden Sitze

Returns:
dict: Dictionary mit Parteien und ihren zugeteilten Sitzen
"""
# Ergebnis-Dictionary initialisieren
sitzverteilung = {partei: 0 for partei in stimmen}

# Liste für Höchstzahlen erstellen: (Höchstzahl, Partei)
hoechstzahlen = []

# Höchstzahlen für jede Partei berechnen
for partei, stimmenzahl in stimmen.items():
# Erste Höchstzahl (Stimmen / 1)
hoechstzahlen.append((stimmenzahl, partei))

# Sitze verteilen
for _ in range(sitze_gesamt):
# Höchste Zahl finden und sortieren
hoechstzahlen.sort(reverse=True)
aktuelle_hoechstzahl, gewinner_partei = hoechstzahlen[0]

# Sitz der Partei mit der höchsten Zahl zuteilen
sitzverteilung[gewinner_partei] += 1

# Neue Höchstzahl für die Gewinner-Partei berechnen
# Nächster Divisor ist 2 * aktuelle Sitze + 1
neuer_divisor = 2 * sitzverteilung[gewinner_partei] + 1
neue_hoechstzahl = stimmen[gewinner_partei] / neuer_divisor

# Alte Höchstzahl entfernen und neue einfügen
hoechstzahlen.pop(0)
hoechstzahlen.append((neue_hoechstzahl, gewinner_partei))

return sitzverteilung

# Beispielanwendung
def main():
# Beispieldaten: Parteien und ihre Stimmen
wahlergebnisse = {
"Partei A": 47000,
"Partei B": 26000,
"Partei C": 19000,
"Partei D": 8000
}

# Gesamtzahl der Sitze
gesamt_sitze = 10

# Sitzverteilung berechnen
ergebnis = sainte_lague_schepers(wahlergebnisse, gesamt_sitze)

# Ergebnisse ausgeben
print("Wahlergebnisse:")
for partei, stimmen in wahlergebnisse.items():
print(f"{partei}: {stimmen} Stimmen")

print(f"\nSitzverteilung für {gesamt_sitze} Sitze:")
for partei, sitze in ergebnis.items():
print(f"{partei}: {sitze} Sitze")

if __name__ == "__main__":
main()

Erklärung des Programms:

Funktion sainte_lague_schepers:
Nimmt ein Dictionary mit Parteien und ihren Stimmen sowie die Gesamtzahl der Sitze als Eingabe.
Initialisiert ein Dictionary sitzverteilung, das die Sitze pro Partei speichert (zu Beginn alle 0).
Erstellt eine Liste von Höchstzahlen, beginnend mit den ursprünglichen Stimmenzahlen (Divisor 1).
Verteilt die Sitze iterativ:
Findet die höchste Höchstzahl und vergibt einen Sitz an die entsprechende Partei.
Berechnet die nächste Höchstzahl für diese Partei mit dem nächsten ungeraden Divisor (1, 3, 5, ...).
Wiederholt diesen Vorgang, bis alle Sitze verteilt sind.
Divisoren:
Das Sainte-Laguë/Schepers-Verfahren verwendet die ungeraden Zahlen 1, 3, 5, 7, ... als Divisoren.
Nach jedem zugeteilten Sitz wird der nächste Divisor für die betreffende Partei berechnet: 2 * aktuelle_sitze + 1.
Ausgabe:
Das Programm gibt die ursprünglichen Stimmenzahlen und die berechnete Sitzverteilung aus.

Beispielausgabe:

Für die Eingabe:
python
wahlergebnisse = {
"Partei A": 47000,
"Partei B": 26000,
"Partei C": 19000,
"Partei D": 8000
}
gesamt_sitze = 10

Ergebnis:
text
Wahlergebnisse:
Partei A: 47000 Stimmen
Partei B: 26000 Stimmen
Partei C: 19000 Stimmen
Partei D: 8000 Stimmen

Sitzverteilung für 10 Sitze:
Partei A: 4 Sitze
Partei B: 2 Sitze
Partei C: 2 Sitze
Partei D: 1 Sitz
Anpassungen:

Du kannst die Wahlergebnisse und gesamt_sitze im main()-Abschnitt an deine eigenen Daten anpassen.
Das Programm berücksichtigt keine Sperrklauseln (z. B. 5%-Hürde). Falls das gewünscht ist, müsste eine zusätzliche Filterung der Parteien vor der Berechnung implementiert werden.

Dieses Programm bietet eine einfache und korrekte Umsetzung des Sainte-Laguë/Schepers-Verfahrens!


gesamter Thread:

RSS-Feed dieser Diskussion

Werbung