CCCPaste

norm_krimi.py

from rich import get_console
from rich.table import Table


def normalisiert(gesamt: list[int], anzahl_straftäter: list[int]) -> list[float]:
    """
    Berechnet für jede Bevölkerungsgruppe die normierte Straftäterrate.

    gesamt: Gesamtgröße der jeweiligen Bevölkerungsgruppe.
    anzahl_straftäter: Anzahl der Straftäter je Gruppe.

    Eine Liste mit den normierten Raten (0.0 bis 1.0).
    """
    if len(anzahl_straftäter) != len(gesamt):
        raise ValueError("Beide Listen müssen gleich lang sein.")

    ergebnis = []

    for straftäter, bevölkerung in zip(anzahl_straftäter, gesamt):
        if bevölkerung <= 0:
            raise ValueError("Alle Bevölkerungsgrößen müssen größer als 0 sein.")
        ergebnis.append(straftäter / bevölkerung)

    return ergebnis


def zeige_tabelle(farben: list[str], gesamt: list[int], anzahl_straftäter: list[int]):
    ergebnis = normalisiert(gesamt, anzahl_straftäter)
    summe = sum(gesamt)
    console = get_console()
    table = Table(title="Normalisierte Kriminalitätsraten")

    for col in (
        "Farbe",
        "Population",
        "Strafäter",
        "Rel. (gesamt)",
        "Rel. (normalisiert)",
    ):
        table.add_column(col)

    for farbe, anzahl, straftäter, rel_norm in zip(
        farben, gesamt, anzahl_straftäter, ergebnis
    ):
        rel_gesamt = straftäter / summe
        table.add_row(
            f"{farbe.title()} Schafe",
            f"{anzahl:>10}",
            f"{straftäter:>10}",
            f"{rel_gesamt:>7.1%}",
            f"{rel_norm:>7.1%}",
        )

    console.print(table)


schwarze_schafe = 90
weiße_schafe = 10

straftaten_schwarz = 5
straftaten_weiß = 5

farben = ["schwarze", "weiße"]
gesamt = [schwarze_schafe, weiße_schafe]

anzahl_straftäter = [straftaten_schwarz, straftaten_weiß]
zeige_tabelle(farben, gesamt, anzahl_straftäter)