HOWTO · Python

如何在 Python 中比較元組

通過這份全面的指南,學習如何有效地比較 Python 中的元組。探索各種方法,包括相等性檢查、不等性檢查和字典序比較。了解如何利用內建函數進行逐元素比較。無論你是初學者還是有經驗的程式設計師,都能通過實用的例子和清晰的解釋來提高你的編碼技能。

本頁內容

在使用 Python 時,你可能經常需要比較元組。元組是不可變的序列,也就是說,一旦創建,它們就不能被修改。這一特性使它們特別適合用來儲存固定的項目集合。比較元組可以幫助你確定它們的相等性、順序,甚至它們的內容。

在本文中,我們將探討 Python 如何比較元組,從簡單的相等性檢查到字典序排序,以及當元組在型別、長度或巢狀方面不同時,比較會如何進行。

Python 如何比較元組

Python 以字典序比較元組,就像單詞在字典中的排列方式一樣。它比較每個元組的第一個元素;如果它們不同,這第一個差異就決定了比較的結果,其餘元素根本不會被查看。如果第一個元素相等,它就繼續比較下一對,依此類推,直到找到差異或元素用完為止。如果一個元組是另一個元組的開頭部分,即它的所有元素都與較長元組的開頭相匹配,那麼較短的元組被認為小於較長的元組。

相等運算子(==)檢查兩個元組是否具有相同順序的相同元素,而不等運算子(!=)則與之完全相反:

tuple1 = (1, 2, 3)
tuple2 = (1, 2, 3)
tuple3 = (1, 2, 4)

print(tuple1 == tuple2)
print(tuple1 == tuple3)
print(tuple1 != tuple3)

輸出:

True
False
True

順序運算子(<、<=、>、>=)採用同樣的逐元素掃描,並利用每一對元素自身的順序來做決定:

tuple1 = (1, 2, 3)
tuple2 = (1, 2, 4)
tuple3 = (1, 2)

print(tuple1 < tuple2)
print(tuple1 > tuple3)

輸出:

True
True

在這裡,tuple1 小於 tuple2,因為前兩個元素相等,且 3 < 4。而 tuple1 大於 tuple3,因為 tuple3 是 tuple1 的開頭部分,所以較長的元組排在較短的元組之後。

處理不同型別、長度與巢狀元組

相等性和順序對混合型別的處理方式並不相同,混淆這兩者是產生錯誤預期的常見原因。

相等性永遠不會因為型別而引發錯誤。兩個不同型別的元素就是不相等——除了一個通常的數值例外,像 1 和 1.0 這樣的值被認為相等——因此,用 == 進行的元組比較返回 False,用 != 返回 True,在此之前沒有人會先檢查型別:

tuple1 = (1, "a", 3)
tuple2 = (1, 2, 3)

print(tuple1 == tuple2)
print(tuple1 != tuple2)

輸出:

False
True

順序則更為嚴格。一旦順序比較遇到一對無法相互排序的元素,例如字串與整數,它就會引發 TypeError,而不是返回結果:

tuple1 = (1, "a", 3)
tuple2 = (1, 2, 3)

print(tuple1 < tuple2)

輸出:

TypeError: '<' not supported between instances of 'str' and 'int'

第一個元素相等,所以比較繼續進行到 "a" 與 2,而字串和整數之間沒有任何順序,因此出現錯誤。請注意,這只會在比較真正到達不匹配的那一對時才會發生:(0, "a") < (1, 2) 會毫無錯誤地返回 False,因為第一個元素已經決定了結果。

不同的長度與一種常見的逐元素相等性檢查之間有一種容易被忽視的相互作用。將 all() 與 zip() 結合起來會比較 zip() 產生的配對,而 zip() 會在較短的元組處停止,因此那些沒有配對的末尾元素會被悄悄地忽略掉:

tuple1 = (1, 2, 3)
tuple2 = (1, 2)

print(all(a == b for a, b in zip(tuple1, tuple2)))
print(len(tuple1) == len(tuple2) and all(a == b for a, b in zip(tuple1, tuple2)))

輸出:

True
False

第一行報告了 True,儘管這兩個元組並不相等,因為末尾的 3 從未被比較過。如果你使用這種模式——它對於大型元組或自定義的逐元素邏輯很方便——請務必像第二行那樣,始終將它與長度檢查結合起來。

巢狀元組不需要任何特殊處理:元組元素會按照與任何其他元素相同的規則遞迴地進行比較。一個元組內的 (1, 2) 排在另一個元組內的 (3, 5) 之前,因為它們各自第一個不同的元素決定了這一點:

tuple1 = ((1, 2), (3, 4))
tuple2 = ((1, 2), (3, 5))

print(tuple1 < tuple2)
print(tuple1 == tuple2)

輸出:

True
False

簡而言之:當你只需要知道兩個元組是否相同時,就使用 == 和 !=——它們對任何內容都有效。當你需要相對順序時,使用順序運算子,並確保比較真正會到達的那些元素能夠相互排序。