Compare Lists

Paste one list into each box, one item per line, and the three result panels fill in as you type: what appears only in the first list, what appears in both, and what appears only in the second. Everything runs in your browser, so the lists never leave your device.

Only in List A

0

    In Both Lists

    0

      Only in List B

      0

        Set Operations Without the Jargon

        Comparing two lists is a set problem, and the vocabulary is worth knowing because it is what spreadsheet documentation and database manuals use.

        One thing that is not covered: subset testing. If the left panel is empty, every item in List A also appears in List B, which means A is a subset of B. An empty left panel and an empty right panel means the two lists are identical as sets.

        Set Comparison Is Not a Diff

        A file diff — git diff, or the compare pane in an editor — is positional. It cares about order, reports moved lines as a deletion plus an insertion, and preserves duplicates. That is what you want when comparing two revisions of source code.

        Set comparison throws position away. Reordering a list changes nothing about the result. That is what you want when comparing two exports of the same underlying data, because export order is usually an accident of how the query was sorted and carries no meaning. If a nightly extract sorts by ID one day and by creation date the next, a diff will show you thousands of changed lines and a set comparison will correctly show none.

        Normalise Before You Compare

        Most surprising results come from the two lists being formatted slightly differently rather than actually containing different data. The three checkboxes handle the common cases.

        Trim whitespace (on by default) strips leading and trailing spaces and tabs from each line. It also removes the stray carriage return that Windows-style CRLF line endings leave at the end of every line, which is the single most common cause of "nothing matches at all" when one list was pasted from a Windows text file and the other from a web page. Note that whitespace inside an entry is untouched: Acme Ltd with two internal spaces will never match Acme Ltd, and a non-breaking space pasted out of a PDF or a Word document looks identical on screen but is a different character from a normal space.

        Ignore case lowercases everything before comparing. Email addresses are the usual reason to switch it on. The domain part of an address is defined as case-insensitive, and while the local part technically is not, every mainstream mail provider treats it as though it were — so Ada@Example.com and ada@example.com reach the same inbox and should be treated as one subscriber.

        Skip empty lines (on by default) drops blank lines so that a trailing newline at the end of a paste does not show up as a mysterious empty result.

        What the tool deliberately does not do is strip quoting or delimiters. If you paste a column straight out of a CSV, entries may arrive wrapped in double quotes, or carry a trailing comma, or begin with a UTF-8 byte order mark on the very first line. Clean those in your spreadsheet before pasting, or you will compare "SKU-1001" against SKU-1001 and be told nothing matches.

        A Worked Example: Two Catalogue Exports

        Suppose you export product codes from last quarter's catalogue and this quarter's, and want to know what changed.

        List A (last quarter): SKU-1001, SKU-1002, SKU-1003, SKU-1004, SKU-1002

        List B (this quarter): SKU-1002, SKU-1003, SKU-1005, SKU-1006

        SKU-1002 appears twice in List A and collapses to one entry, so List A contributes four distinct codes and List B four. The results:

        Panel Count Items Means
        Only in List A 2 SKU-1001, SKU-1004 Discontinued this quarter
        In both lists 2 SKU-1002, SKU-1003 Carried over
        Only in List B 2 SKU-1005, SKU-1006 New this quarter

        Union size is 2 + 2 + 2 = 6 distinct products across both quarters.

        Now the normalisation trap. Take an email reconciliation instead:

        List A (newsletter subscribers): ada@example.com, BEN@example.com, cleo@example.com, cleo@example.com

        List B (customers who bought): ada@example.com, ben@example.com, dev@example.com

        With "ignore case" off, only ada@example.com lands in the middle panel — one match. Switch "ignore case" on and Ben is recognised as the same person in both lists, giving two matches, one subscriber who never bought (Cleo), and one buyer who is not on the list (Dev). Same data, and the answer to "how many of our buyers are subscribed?" doubles depending on one checkbox. Decide on your normalisation rules before you look at the numbers.

        Where This Gets Used

        Reconciling marketing against sales. Export your subscriber list and your purchaser list. The middle panel is the group that converted; the right panel is buyers you are not emailing, which is usually the most valuable list on the page.

        Auditing an access allowlist. Compare the IPs, hostnames or user accounts a deployment config permits against the list your infrastructure inventory says exists. Entries only in the config are stale grants — machines that were decommissioned but never removed. Entries only in the inventory are hosts that will be refused at deploy time.

        Diffing two inventory or stock exports. Which items were in yesterday's warehouse feed and not today's, and vice versa. Because it ignores row order, it works even when the two systems sort differently.

        Checking a migration. Export the primary keys from the source table and the destination table after a data move. Both outer panels should be empty. Anything in the left panel failed to migrate.

        Finding untranslated strings. Compare the message keys in your base locale file against those in a translated one. The left panel is your to-do list.

        Limits Worth Knowing

        The comparison is exact-match only — there is no fuzzy matching, so Acme Ltd, Acme Ltd. and ACME Limited are three different items even with case ignored. Reconciling company names or postal addresses needs cleaning first, and no amount of checkbox tweaking substitutes for that.

        It also works on one column at a time. To compare rows with several fields, concatenate the fields into a single key per row in your spreadsheet (=A2&"|"&B2 and fill down), paste the resulting column, and the comparison becomes a compound-key match.

        Finally, the tool answers membership, not multiplicity. If you need to know that an order ID appears four times rather than once, count occurrences elsewhere first. For working with the counts themselves, the bar chart maker will plot the matched-versus-unmatched totals, and if you are cleaning text rather than comparing it the word counter and character counter handle length checks on the entries.

        Frequently Asked Questions

        Does the order of the items matter?

        No. The comparison is set-based, so it only asks whether an item appears in a list, not where. Two lists containing the same items in a scrambled order produce zero unique items on either side. If position matters to you — as it does when comparing two versions of a file line by line — you want a diff tool instead.

        What happens to duplicate entries?

        Duplicates within a list collapse to a single entry before comparison. A list containing the same email address three times contributes one item. That means the tool tells you whether something appears, never how many times it appears, so it is the wrong tool for finding duplicates inside one list.

        Should I turn on 'ignore case'?

        Turn it on for anything humans typed or that is case-insensitive in practice: email addresses, hostnames, country names, tags. Leave it off for values where case is meaningful — case-sensitive IDs, Linux file paths, API keys, and base64 strings, where 'A' and 'a' are genuinely different values.

        Can I get the union of the two lists?

        Yes, indirectly. The three result panels partition the union with no overlap, so 'only in A' plus 'in both' plus 'only in B' is the deduplicated union of both lists. Adding the three counts together gives the size of the union.

        Is my data sent anywhere?

        No. The comparison runs in your browser in JavaScript. Nothing is uploaded, logged or stored, which matters when the lists are customer emails, internal SKUs or an access allowlist. You can disconnect from the network after the page loads and the tool keeps working.

        How large a list can I paste in?

        There is no fixed cap. Comparison uses hash sets, so the work grows roughly in proportion to the number of lines rather than exponentially, and lists in the tens of thousands of lines compare without a noticeable pause. The practical limit is your browser's memory and how much output you want to scroll through.