# How Voting Systems Work 8, Exercise 1: efficiency gap of a six-district map # Assumed, invented tallies (votes for party A, votes for party B) in six districts. districts = [(5200, 4800), (4100, 5900), (3300, 6700), (6100, 3900), (4600, 5400), (4400, 5600)] def wasted(a, b): needed = (a + b) // 2 + 1 return (a - needed, b) if a > b else (a, b - needed) wa = wb = total = 0 for i, (a, b) in enumerate(districts, 1): x, y = wasted(a, b) wa, wb, total = wa + x, wb + y, total + a + b print(f"district {i}: A {a:>5} B {b:>5} wasted A {x:>5} wasted B {y:>5}") gap = (wa - wb) / total print(f"total wasted: A {wa}, B {wb}; total votes {total}") print(f"A vote share {sum(a for a, b in districts) / total:.1%}, A seats {sum(a > b for a, b in districts)}/{len(districts)}") print(f"efficiency gap {gap:+.1%} ->", "favours B" if gap > 0 else "favours A") print("above an 8% flag" if abs(gap) >= 0.08 else "below an 8% flag") # Output when run: # district 1: A 5200 B 4800 wasted A 199 wasted B 4800 # district 2: A 4100 B 5900 wasted A 4100 wasted B 899 # district 3: A 3300 B 6700 wasted A 3300 wasted B 1699 # district 4: A 6100 B 3900 wasted A 1099 wasted B 3900 # district 5: A 4600 B 5400 wasted A 4600 wasted B 399 # district 6: A 4400 B 5600 wasted A 4400 wasted B 599 # total wasted: A 17698, B 12296; total votes 60000 # A vote share 46.2%, A seats 2/6 # efficiency gap +9.0% -> favours B # above an 8% flag