# (group, actually qualified?, model selected?)
results = [
("A", True, True), ("A", True, True), ("A", False, True),
("A", False, False), ("A", True, True),
("B", True, False), ("B", False, False), ("B", True, True),
("B", False, False), ("B", True, False),
]
def rates(group):
rows = [r for r in results if r[0] == group]
selected = sum(1 for g, q, s in rows if s)
qualified = [r for r in rows if r[1]]
qualified_selected = sum(1 for g, q, s in qualified if s)
return selected / len(rows), qualified_selected / len(qualified)
for g in ["A", "B"]:
sel, tpr = rates(g)
print(f"Group {g}: selection rate {sel:.2f}, true positive rate {tpr:.2f}")
Each tuple is one applicant. The generator expressions count matching rows.