When and Why to Use
Use this to ask binary forced-choice questions across multiple comparisons. It's ideal for:
Preference testing between paired items
Quick-fire brand or concept comparisons
Engaging users with fast-paced choice tasks
Supports randomization and media-based comparisons.
Portrait Experience
Each pair appears as a row with two side-by-side buttons or tiles
Users select one item at a time
Landscape Experience
All pairs displayed in grid format
Responsive to keyboard or remote selection
Layout adapts to show multiple pairs simultaneously
Configuration Options
Option | Type | Required | Default | Description |
|
| yes | - | The main prompt for the task |
| `List[List[str | MediaItem]]` | yes | - |
|
| no |
| Shuffle the order of rows |
|
| no |
| Shuffle left/right order within each pair |
|
| no | random choices | Default test responses per pair |
|
| no | - | Map raw values to grouped outputs |
|
| no | - | Top-level image shown above the task |
|
| no | - | Label to show above any media items |
|
| no |
| Whether to show labels on image tiles |
|
| no | - | Size of displayed images |
| `Callable[[Dict[str, str]], str | None]` | no | - |
|
| no | - | Used for token substitution and reporting |
Example Code
s.this_or_that_question( "Which of the following do you prefer?", row_options=[ ["Apples", "Oranges"], ["Coke", "Pepsi"], ["Dogs", "Cats"], ["Winter", "Summer"] ] )
With recodes:
s.this_or_that_question( "Which of the following do you prefer?", row_options=[["Netflix", "Disney+"], ["Prime", "Apple TV"]], recodes={ "Netflix": "streaming", "Disney+": "streaming", "Prime": "ecommerce", "Apple TV": "streaming" } )
With custom validator:
s.this_or_that_question( "Choose your favorite in each pair", row_options=[["Day", "Night"], ["Hot", "Cold"]], custom_validator=lambda d: "Please vary your responses" if len(set(d.values())) == 1 else None )
Notes
Each
row_options
entry must contain exactly two itemsRandomizing column order helps reduce left/right bias
recodes
simplify grouped reporting or segmentationUse
custom_validator
to enforce answer patterns or detect straight-lining