Find distinct items in lists

Find items that appear in exactly one list across multiple `#`-separated blocks. Items present in two or more lists are dropped. Output preserves the original block order - items from List 1 first, then List 2, etc. For items present in every list, use Find common items.

Input
Ready
Output
Live

Multi-list symmetric difference

The parser splits input on `# List` header lines, collects items per block (deduped within each block), and counts how many distinct blocks each item appears in. Only items with a count of exactly 1 survive - i.e. items that appear in one list and nowhere else.

Output is emitted in block order: list 1's distinct items first, then list 2's, and so on. Within each list, the original order is preserved. Two or more lists are required - a single block returns an empty result with a status-bar note.

Case sensitive (off by default) controls the compare key. Off: `Apple`, `APPLE`, `apple` collapse into the same identity, so if any case variant is in another list the whole cluster is dropped. On: each case variant is tracked independently.

How to use find distinct items in lists

  1. 1Paste two or more lists into the input panel
  2. 2Separate lists with `# List 1`, `# List 2`, ... header lines
  3. 3Output keeps only items that appear in exactly one list
  4. 4Order: list 1's uniques first, then list 2's, etc.
  5. 5For the opposite (items in every list), use Find common items

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

Keep items present in exactly one list; drop items present in two or more.

N-way distinct

Works with two lists or any N. An item must appear in exactly one of the N blocks to survive - the threshold is always "exactly one", not "not in all".

Within-list dedupe before counting

A value repeated in the same block counts as one occurrence of that block. So `apple / apple` in list 1 and `apple` nowhere else still produces `apple` once in the output.

Block-order output

Items are emitted list 1 first, then list 2, etc. Within each block, the original input order is preserved.

Case-insensitive by default

`Apple` in list 1 and `APPLE` in list 2 count as the same item and are both dropped. Toggle Case sensitive on to treat them as distinct.

Whitespace is significant

No trim option - ` apple` and `apple` are distinct. Chain trim first if the input has inconsistent whitespace.

Worked example

`banana` appears in both lists and is dropped. `apple`, `orange` (list 1) + `grape`, `kiwi` (list 2) survive.

Input
# List 1
apple
banana
orange
# List 2
banana
grape
kiwi
Output
apple
orange
grape
kiwi

Settings reference

How each option shapes the output using the sample above.

Setting What it does Effect on the sample
Case sensitive: off (default) `Banana` = `banana` = `BANANA` `banana` drops from both lists; 4 items output
Case sensitive: on Exact-case match required `banana` in list 1 and `banana` in list 2 still match - 4 items. But `Banana` vs `banana` would keep both.
Single list (no `# List` header) Returns empty output Status bar: "Paste two or more lists separated by `# List X` headers"
Within-list duplicates (automatic) Count as one occurrence of that block `apple / apple` in list 1 emits `apple` once

FAQ

What exactly counts as "distinct" here?
An item that appears in exactly one list - no more, no less. If it appears in two or more of the N input blocks, it is dropped. That makes this the symmetric difference operator across any number of lists.
How does this differ from Find common items?
Find common items keeps items present in *every* list (intersection). This tool keeps items present in *exactly one* list (symmetric difference). Together they cover the two ends of the multi-list spectrum.
Can I compare more than two lists?
Yes. Add `# List 3`, `# List 4`, ... headers for as many blocks as you need. An item is kept only if it appears in exactly one block out of all of them.
What about duplicates within the same list?
Deduped before the count. Two `apple`s in list 1 count as one appearance of list 1. The output then emits the item once if it is unique to that list.
Why is the output empty?
Either your input only has one block (you need at least two `# List` blocks), or every item appears in multiple lists. Check the status bar for a specific message.