若要比對兩個清單的差異,請將每行一個項目分別貼到兩個方框中,選擇是否以字母大小寫決定成員身分,然後讀取五個穩定的檢視——共通、僅 A、僅 B、聯集與對稱差異——而不必重新排序輸入內容。Compare Two Lists 工具會將每一行去除空白後的非空行視為一個集合成員:空行會被刪除,重複項目會合併為第一個出現的拼寫,而你輸入的順序就是讀回的順序。每次比對都在您的瀏覽器本機執行,因此任何清單都不會被上傳、記錄或傳送至任何外部服務。填入可見面板的同一組標準化陣列,也會同步送進您複製的標籤化報告,這表示快速視覺檢查的結果,與您貼到目標系統中的內容一致。五個運算名稱採用 MDN 的集合方法參考以及 Python 內建集合類型所使用的標準集合術語,因此結果面板中的「union」或「symmetric difference」與在程式碼中所代表的意義完全相同。

compare two lists for differences
compare two lists for differences

「Compare Two Lists」工作實際上在做什麼

比對兩個清單就是日常工作中指出哪些項目同時出現在兩個清單中、哪些項目只出現在其中一個清單。可見的結果必須一目了然:共有的列、不共有的列,以及兩個集合合併後的整體輪廓。挑戰在於日常清單中會有錯字、大小寫不一致、因複製貼上而產生的空白列,以及散落的重複項目,而這些都會改變應被視為單一項目的條件。將輸入視為一組成員身分鍵,並計算五個具名檢視,才能讓比對結果具有可重現性與可解釋性。

Compare Two Lists 工具會將每一行去除空白後的非空行視為一個成員,並在所有面板中一致地套用您選擇的大小寫規則。因為同一組標準化陣列同時驅動可見面板與複製的報告,您所看見的就是您將貼到目標系統中的內容。過程中沒有隱藏的排序步驟,也不會靜默地重新格式化;工具會依照成員首次出現的順序回傳結果,並對重複項目維持首次拼寫的穩定性。

為什麼是五個檢視,而非單一差異清單

單一的「差異」答案很少能符合單一實際任務。協調兩份電子郵件清單通常需要聯集,但遷移檢查通常需要對稱差異,而 CSV 清理通常需要把僅 A 的項目與僅 B 的項目分開。透過一次運算產生全部五個標籤化檢視,您就可以擷取任何符合下游步驟的片段,而不必再以不同規則重新執行比對。

一次取得五個集合檢視

五個標籤化面板採用 JavaScript 與 Python 標準程式庫所使用的標準集合術語,因此無論您在程式碼中讀到或在結果面板中讀到,同一個字詞都代表相同的意義。

檢視標籤集合意義典型用途
兩者皆有同時存在於清單 A 與清單 B 的項目對帳、共同庫存、重疊報告
僅 A存在於清單 A 但不在清單 B 的項目需要新增到 B 的項目、A 專屬清理
僅 B存在於清單 B 但不在清單 A 的項目需要新增到 A 的項目、B 專屬清理
聯集任一或兩個清單中的所有項目,已去除重複合併記錄、整體成員身分、去重報告
僅其一非兩者僅出現在其中一個清單、不同時在兩個清單的項目對稱差異、缺口分析、遷移檢查

每個面板內部的排序遵循首次出現規則:A 的成員按照它們在清單 A 中被輸入的順序出現,而先前未出現的 B 成員則依照它們在清單 B 中被輸入的順序附加在後。工具絕不會重新排序結果,這表示您的閱讀順序與輸入順序一致。

使用兩個簡短清單的實作範例

假設清單 A 為 applebananapear,清單 B 為 bananapeach。五個檢視的結果如下:

  • 兩者皆有:banana —— 唯一共有的行。
  • 僅 A:applepear —— 兩者皆不在 B 中。
  • 僅 B:peach —— 不在 A 中。
  • 聯集:applebananapearpeach —— 依首次出現順序排列,來自兩個清單的所有不同行。
  • 僅其一非兩者:applepearpeach —— 僅 A 與僅 B 的組合。

您可以手動驗證對稱差異:將僅 A 與僅 B 合併,然後確認合併清單中的每一行都正好只在一個輸入清單中缺席。

逐步執行比對

整個工作是一個簡短且固定的程序。從兩份每行一個項目的純文字清單開始,決定大小寫是否影響成員身分,然後執行比對並在複製任何下游內容前檢查每個面板。

  1. 將清單 A 貼到第一個方框。每行一個項目。請避免在每列末端加上多餘的逗號或零散的 tab——工具會自動去除,但輸入越乾淨,檢閱也越清晰。
  2. 將清單 B 貼到第二個方框。同樣維持一行一項的規則。若首次拼寫穩定性對您很重要,請保留原本的順序,因為該順序會一路傳遞到結果中。
  3. 選擇大小寫是否影響成員身分。若您的清單是自然語言、且 Apple 與 apple 應視為同一個人,請選擇不區分大小寫;若您的內容是代碼、識別碼或密碼(大小寫具意義),請選擇區分大小寫。
  4. 執行比對並讀取每個標籤化面板。檢查「兩者皆有」、「僅 A」、「僅 B」、「聯集」與「僅其一非兩者」。您所選擇的大小寫原則會一致套用於全部五個檢視。
  5. 複製標籤化報告並對照目標系統進行驗證。寫入剪貼簿的動作僅在瀏覽器確認後才會發生;若瀏覽器拒絕剪貼簿存取,請改採手動複製指示,而非假設操作成功。在目標系統中抽查一兩行,以確認其預期的字面行原則與您貼入的字面行原則相符。

大小寫敏感性原則的決策

Appleapple 比對為相符、或將其視為兩個不同成員之間的抉擇,是整個比對中最具關鍵影響的決定,因為它會改變何者算作重複的鍵。

在不區分大小寫的模式下,兩個輸入都會被標準化為英文小寫的成員身分鍵,同時保留首次出現的拼寫原樣顯示。若 Apple 先出現在清單 A 中,則該大寫 A 的拼寫會出現在「兩者皆有」與「聯集」面板中,儘管成員身分鍵其實是 apple。在區分大小寫的模式下,原本的大小寫會成為鍵的一部分,因此 Appleapple 會被回報為兩個不同的行,並各自出現在其對應的「僅 A」或「僅 B」欄位中(前提是另一個清單缺少相同的拼寫)。

若您處理的是面向人類的集合——與會者姓名、電子郵件地址、郵寄名單、產品標籤——其中偶發的大寫只是錯字,請選擇不區分大小寫。若您處理的是代碼、URL、環境名稱、檔案路徑與 API 金鑰——其中大小寫具語意——請選擇區分大小寫。工具明確表示,所選原則會一致套用於去重與所有五項運算,因此您只需決定一次。

影響結果的行標準化規則

在任何集合運算執行之前,工具會對您貼上的每一行套用一組固定的標準化流程。CRLF 與單獨的 CR 行尾會被轉為 LF,這代表從 Windows 郵件或舊式指令稿複製而來的清單,仍能與從 Unix 環境貼上的清單乾淨地進行比對。每行周圍的空白會被去除,但行內部的空白會原封不動地保留。空行與僅含空白的行會被移除。重複的鍵會合併為單一成員項目,同時保留首次輸入的拼寫。

這四條規則——CRLF → LF、邊緣去空白、去除空行、首次拼寫去重——共同解釋了所有「為什麼這一行消失了?」的疑問。在試算表中看似空白的列會被視為空,並在去重開始前就被移除。像 Apple 這樣的列在成員身分判定上會被修剪為 Apple;若先前輸入的 Apple 在不區分大小寫模式下已佔用了該鍵,則修剪後的列會以首次拼寫回報,而非修剪後的形式。

順序同樣是結果中刻意保留的一部分:這裡沒有排序。「聯集」面板依 A 的首次出現順序讀取,並附加新的 B 成員;其餘所有面板則依照成員進入各自清單的順序排列。若您的下游系統需要排序後的輸出,請在複製標籤化報告後自行排序;不要假設比對工具會重新排列任何內容。

何時不應使用清單比對工具

此工具僅比對字面標準化後的行鍵。它不是資料庫連接、試算表合併工具、差異檢視器,也不是模糊去重工具。它不會剖析 CSV 欄位、不會分割逗號、不會標準化 Unicode 易混淆字元,也不會辨識等義的網域與商業身分。它不會以數值方式比對數字,因此 102 是兩個不同的字串成員,而非兩個相等的數字。它不具備任何安全存取控制驗證,也不包含別名對照表,因此將比對結果當作允許清單判斷是冒險的做法。

若您的任務需要上述任何功能——比對近似拼寫、以欄位進行連接、排序、重組以分隔符號拆開的列——請先將清單載入專用工具,並把清理後的一行一項輸出再帶回比對工具。當您的目標系統本身具有標準化規則時,相同的建議也適用:請先檢閱大小寫原則與空白處理方式,再將任何結果視為具決定性,因為若下游標準化器將所有內容轉為小寫,它會與此處的不區分大小寫模式一致;但若下游標準化器會去除行內空白,則不會一致。

兩項最終限制決定比對是否能順利完成。每個輸入上限為一百萬個 UTF-16 字碼單位與 50,000 行;若任一輸入超過任一上限,工具會回傳明確錯誤且不提供部分結果。若兩個標準化後的清單皆為空,工具同樣會回傳明確錯誤,而非回報一個可能會被誤認為「未發現重疊」的五面板全空結果。任一文字區域在比對後被編輯,將會清除先前的結果,因此可見面板永遠反映針對最新輸入所執行的最新一次比對。

若您正在權衡選項,How to Randomize a List Fairly 對此有詳細說明。

若您正在權衡選項,How to Check Difference Between Two Text Files 對此有詳細說明。