Here is a short version that verbalizes the result.
def winner(p1, p2): actors = ['Paper', 'Scissors', 'Rock'] verbs = {'RoSc':'breaks', 'ScPa':'cut', 'PaRo':'covers'} p1, p2 = actors.index(p1), actors.index(p2) winner, looser = ((p1, p2), (p2, p1))[(1,0,1)[p1 - p2]] return ' '.join([actors[winner], verbs.get(actors[winner][0:2] + actors[looser][0:2], 'ties'), actors[looser]])
The advantage of this structure is evident when expanded to cover stones, paper, scissors, lizards, Spock
def winner(p1, p2): actors = ['Paper', 'Scissors', 'Spock', 'Lizard', 'Rock'] verbs = {'RoLi':'crushes', 'RoSc':'breaks', 'LiSp':'poisons', 'LiPa':'eats', 'SpSc':'smashes', 'SpRo':'vaporizes', 'ScPa':'cut', 'ScLi':'decapitate', 'PaRo':'covers', 'PaSp':'disproves'} p1, p2 = actors.index(p1), actors.index(p2) winner, looser = ((p1, p2), (p2, p1))[(1,0,1,0,1)[p1 - p2]] return ' '.join([actors[winner], verbs.get(actors[winner][0:2] + actors[looser][0:2], 'ties'), actors[looser]]) >>> winner("Rock", "Scissors") 'Rock breaks Scissors' >>> winner("Rock", "Spock") 'Spock vaporizes Rock' >>> winner("Spock", "Paper") 'Paper disproves Spock' >>> winner("Lizard", "Scissors") 'Scissors decapitate Lizard' >>> winner("Paper", "Paper") 'Paper ties Paper'