Convert complete preference rankings into winner-loser training pairs. Each record contains a prompt_id and a candidates list; each candidate has id, text, and rank fields. Rank 1 is best, and lower ranks beat higher ranks. Candidate text is context only; output pairs contain IDs.
Include every better/worse candidate combination once. Preserve prompt input order, then order each prompt’s pairs by ascending winner rank and ascending loser rank. Return a Python dictionary with pairs, a list of dictionaries containing exactly prompt_id, winner_id, and loser_id, copied from the input records.
Input: records = [{"prompt_id":"p1","candidates":[{"id":"a","text":"best","rank":1},{"id":"b","text":"middle","rank":2},{"id":"c","text":"last","rank":3}]}]
Output: {"pairs":[{"prompt_id":"p1","winner_id":"a","loser_id":"b"},{"prompt_id":"p1","winner_id":"a","loser_id":"c"},{"prompt_id":"p1","winner_id":"b","loser_id":"c"}]}
Explanation: A strict ranking of three candidates contains all three ordered preference pairs.
Input: records = [{"prompt_id":"p2","candidates":[{"id":"b","text":"second","rank":2},{"id":"a","text":"first","rank":1}]}]
Output: {"pairs":[{"prompt_id":"p2","winner_id":"a","loser_id":"b"}]}
Input: records = [{"prompt_id":"x","candidates":[{"id":"a","text":"A","rank":1},{"id":"b","text":"B","rank":2}]},{"prompt_id":"y","candidates":[{"id":"c","text":"C","rank":1},{"id":"d","text":"D","rank":2}]}]
Output: {"pairs":[{"prompt_id":"x","winner_id":"a","loser_id":"b"},{"prompt_id":"y","winner_id":"c","loser_id":"d"}]}
sorted accepts a key function without changing the original list.
itertools.combinations generates distinct two-item combinations.
Accepts: array
Convert complete preference rankings into winner-loser training pairs. Each record contains a prompt_id and a candidates list; each candidate has id, text, and rank fields. Rank 1 is best, and lower ranks beat higher ranks. Candidate text is context only; output pairs contain IDs.
Include every better/worse candidate combination once. Preserve prompt input order, then order each prompt’s pairs by ascending winner rank and ascending loser rank. Return a Python dictionary with pairs, a list of dictionaries containing exactly prompt_id, winner_id, and loser_id, copied from the input records.
Input: records = [{"prompt_id":"p1","candidates":[{"id":"a","text":"best","rank":1},{"id":"b","text":"middle","rank":2},{"id":"c","text":"last","rank":3}]}]
Output: {"pairs":[{"prompt_id":"p1","winner_id":"a","loser_id":"b"},{"prompt_id":"p1","winner_id":"a","loser_id":"c"},{"prompt_id":"p1","winner_id":"b","loser_id":"c"}]}
Explanation: A strict ranking of three candidates contains all three ordered preference pairs.
Input: records = [{"prompt_id":"p2","candidates":[{"id":"b","text":"second","rank":2},{"id":"a","text":"first","rank":1}]}]
Output: {"pairs":[{"prompt_id":"p2","winner_id":"a","loser_id":"b"}]}
Input: records = [{"prompt_id":"x","candidates":[{"id":"a","text":"A","rank":1},{"id":"b","text":"B","rank":2}]},{"prompt_id":"y","candidates":[{"id":"c","text":"C","rank":1},{"id":"d","text":"D","rank":2}]}]
Output: {"pairs":[{"prompt_id":"x","winner_id":"a","loser_id":"b"},{"prompt_id":"y","winner_id":"c","loser_id":"d"}]}
sorted accepts a key function without changing the original list.
itertools.combinations generates distinct two-item combinations.
Accepts: array