Compare Three Lists for Differences

Paste three lists separated by `# List 1`, `# List 2`, `# List 3` headers and get each differing item tagged with the lists it's in (`A`, `B`, `C`, `A+B`, `A+C`, `B+C`). Items present in all three are omitted - this is a differences view, not a full inventory.

Input
Ready
Output
Live

Tagged membership diff across three lists

Input is one textarea with three blocks separated by `#`-prefixed header lines (`# List 1`, `# List 2`, `# List 3`). Any line starting with `#` resets to a new block, so the exact header text doesn't matter. The op builds a membership set for each block and tags every unique value with the lists it appears in.

Output is tab-separated `tag⇥value` rows, one per differing item. Tags are `A` (only in list 1), `B`, `C`, or combinations `A+B`, `A+C`, `B+C`. Values that appear in all three lists would be `A+B+C` - those rows are DROPPED, not emitted. The order of rows is the order the values first appear when scanning list 1, then 2, then 3.

Case sensitive off (default) folds `Apple` and `apple` into a single value under the first-seen spelling. The tab separator is deliberate: paste the output into a spreadsheet and the tag lands in its own column for easy filtering. For a plain intersection list of values-present-in-all, use Find common items; for a per-list unique-only report, use Find distinct items.

How to use compare three lists for differences

  1. 1Paste all three lists into the input panel, separating each with a `# List 1`, `# List 2`, `# List 3` header line (or any line starting with `#`)
  2. 2Toggle Case sensitive if `Apple` and `apple` should count as different values
  3. 3Output appears live as `tag⇥value` rows - the tag shows which lists the value is in
  4. 4Copy the output, or paste directly into Excel / Sheets so the tag lands in its own column
  5. 5Hit Download to save as a plain text file

Keyboard shortcuts

Drive ListShift without touching the mouse.

Shortcut Action
Ctrl ZUndo last input change
Ctrl Shift ZRedo
Ctrl Shift EnterToggle fullscreen focus on the editor
EscExit fullscreen
Ctrl KOpen the command palette to jump to any tool
Ctrl SSave current pipeline draft Plus
Ctrl PRun a saved pipeline Plus

What this tool actually does

Membership-tagged diff over three `#`-delimited blocks. Items in all three are dropped.

Tagged membership output, not section headers

Every differing item is emitted as a single row `tag⇥item` - where `tag` is one of `A`, `B`, `C`, `A+B`, `A+C`, `B+C`. No section headers, no banners - one value per line, tab before the value so a spreadsheet sees two columns.

Items in all three lists are omitted

A value that appears in every list (tag would be `A+B+C`) is dropped from the output. This is a differences view, not a full inventory. If you want the set of values common to every list, use Find common items - it emits the intersection.

Header-delimited input

Input is a single textarea with three blocks separated by lines starting with `#` (conventionally `# List 1`, `# List 2`, `# List 3` but any `#` line resets to a new block). Pasting three plain blocks without headers won't work - the op expects explicit block separators.

Case sensitive toggle

Off (default) means `Apple` and `apple` tally together under the first-seen spelling. On treats them as distinct values with their own tags.

Deterministic first-appearance order

Rows are emitted in the order each value is first seen when scanning list 1, then list 2, then list 3. Same input gives byte-for-byte identical output every run - safe to diff two runs against each other.

Worked example

Tagged 3-way diff. `Cherry` is in all three lists so it is omitted - the tool only emits items that differ in membership.

Input
# List 1
Apple
Banana
Cherry
# List 2
Banana
Cherry
Date
# List 3
Cherry
Date
Elderberry
Output
A	Apple
A+B	Banana
B+C	Date
C	Elderberry

Settings reference

How each option changes the output, with the sample above as input.

Setting What it does Effect on the sample
Case sensitive: off (default) Folds `Apple` and `apple` into one value under first-seen spelling No visible change on the sample - the words are already consistently cased
Case sensitive: on Treats `Apple` and `apple` as distinct values, each with its own tag No visible change on the sample - the words are already consistently cased

FAQ

What input format does this tool expect?
Three blocks of lines in one textarea, each preceded by a line starting with `#` (conventionally `# List 1`, `# List 2`, `# List 3`). Any line starting with `#` resets to a new block, so `## Bob`, `# Input A`, `#list1` all work as separators. Without the `#` headers the tool can't find block boundaries and returns a "paste three lists separated by # List X headers" status.
Why are items that appear in all three lists missing from the output?
Deliberate. This is a differences view - it emits only values whose membership differs across the three lists. A value present in every list would get the tag `A+B+C`, and the op drops those rows. For a list of values present in every input, use Find common items.
What do the tags mean?
`A` = only in list 1. `B` = only in list 2. `C` = only in list 3. `A+B` = in lists 1 and 2 but not 3. `A+C` = in lists 1 and 3 but not 2. `B+C` = in lists 2 and 3 but not 1. `A+B+C` would mean "in all three" but those rows are suppressed (see above).
How does the tool handle empty lists?
An empty block (a header line followed by nothing) contributes no items. Values in the other two lists are tagged only with the letters of the lists they're actually in.
Can I compare more than three lists?
This op is fixed at three. For a general N-list diff, use Find distinct items which accepts any number of `# List` blocks and returns items that appear in exactly one list.