# How Voting Systems Work 5, Exercise 1: plurality, Borda and Dowdall for a five-candidate club vote # 25 members rank five candidates (assumed, invented numbers). # Print each method's scores and winner, and say whether the three agree. from collections import Counter groups = [ (8, ("Eve", "Dan", "Cy", "Bo", "Ana")), (6, ("Ana", "Bo", "Cy", "Dan", "Eve")), (5, ("Cy", "Bo", "Dan", "Ana", "Eve")), (4, ("Bo", "Cy", "Ana", "Dan", "Eve")), (2, ("Dan", "Cy", "Bo", "Eve", "Ana")), ] ballots = [r for count, r in groups for _ in range(count)] k = len(ballots[0]) plural = Counter(b[0] for b in ballots) borda, dowdall = Counter(), Counter() for b in ballots: for place, c in enumerate(b): borda[c] += k - 1 - place dowdall[c] += 1 / (place + 1) results = {} for label, tally in (("plurality", plural), ("Borda", borda), ("Dowdall", dowdall)): tally = {c: round(tally[c], 2) for c in sorted(ballots[0])} results[label] = max(tally, key=tally.get) print(f"{label:<10}{tally} -> {results[label]}") print("all three agree:", len(set(results.values())) == 1) # Output when run: # plurality {'Ana': 6, 'Bo': 4, 'Cy': 5, 'Dan': 2, 'Eve': 8} -> Eve # Borda {'Ana': 37, 'Bo': 61, 'Cy': 66, 'Dan': 52, 'Eve': 34} -> Cy # Dowdall {'Ana': 10.58, 'Bo': 12.17, 'Cy': 12.67, 'Dan': 10.17, 'Eve': 11.5} -> Cy # all three agree: False