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
- 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 `#`)
- 2Toggle Case sensitive if `Apple` and `apple` should count as different values
- 3Output appears live as `tag⇥value` rows - the tag shows which lists the value is in
- 4Copy the output, or paste directly into Excel / Sheets so the tag lands in its own column
- 5Hit Download to save as a plain text file
Keyboard shortcuts
Drive ListShift without touching the mouse.
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.
# List 1 Apple Banana Cherry # List 2 Banana Cherry Date # List 3 Cherry Date Elderberry
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 |