Python – 檢查字元序列和數字之間是否存在雙射


在數學中,雙射是指在兩個集合之間建立一對一對應關係的函式。這意味著一個集合中的每個元素在另一個集合中都有一個唯一且不同的對應元素,反之亦然。換句話說,雙射確保對映中沒有重複或缺失的元素。

從程式設計的角度來看,特別是 Python,檢查雙射通常涉及驗證兩個序列或集合的元素之間是否存在一對一對映。例如,給定兩個列表 A 和 B,我們可以透過比較列表的長度以及檢查一個列表中的每個元素是否在另一個列表中都有一個唯一且不同的對應元素來檢查它們元素之間是否存在雙射。

字元序列和數字之間可能的雙射

在 Python 中,要檢查字元序列和數字之間是否存在可能的雙射(即一對一對映),我們必須遵循以下步驟。

  • 確保序列長度相同 – 在檢查雙射之前,請確保字元序列和數字序列的長度相同。如果它們的長度不同,則不可能存在雙射。

  • 建立兩個字典來對映字元到數字,反之亦然 – 接下來,我們必須初始化兩個空字典,一個用於將字元對映到數字,另一個用於將數字對映到字元。

  • 迭代序列並填充字典 – 現在使用 zip() 函式同時迭代字元和數字。對於每個字元-數字對,檢查字元是否已存在於字元到數字字典中,以及數字是否已存在於數字到字元字典中。如果這些條件中的任何一個為真,則不可能存在雙射。否則,將字元-數字對新增到字典中。

  • 檢查對映是否是一對一的 – 填充字典後,檢查字元到數字字典的長度是否等於數字到字元字典的長度。如果它們的長度不同,則不可能存在雙射,因為這意味著一個或多個字元或數字具有多個對映。

  • 重複反向對映的過程 – 如果上一步通過了,即對映是一對一的,我們可以選擇性地重複數字到字元的反向對映過程,以確保雙射在兩個方向上都是有效的。

示例

現在讓我們來看一個使用 python 程式碼實現上述步驟的示例。

在這個示例中,'check_bijection()' 函式接受兩個序列 'characters' 和 'digits' 作為輸入。它首先檢查序列的長度是否相同。然後,它為字元到數字和數字到字元對映初始化空字典。

然後,該函式使用 'zip()' 迭代 'characters' 和 'digits',檢查字典中是否存在重複項,如果未找到重複項則填充字典。最後,它檢查兩個字典的長度是否相等,這表示存在一對一對映。

def check_bijection(characters, digits):
   if len(characters) != len(digits):
      return False
   char_to_digit = {}
   digit_to_char = {}
   for char, digit in zip(characters, digits):
      if char in char_to_digit or digit in digit_to_char:
         return False
      char_to_digit[char] = digit
      digit_to_char[digit] = char
   return len(char_to_digit) == len(digit_to_char)
characters = ['a', 'b', 'c']
digits = [1, 2, 3]
print(check_bijection(characters, digits))  
characters = ['a', 'b', 'c']
digits = [1, 2, 2]  
print(check_bijection(characters, digits))

輸出

True
False

示例

在這個例子中,`is_bijection()` 函式建立兩個字典,`char_to_digit` 和 `digit_to_char`,用於跟蹤字元和數字之間的對映。它使用 `zip()` 函式迭代序列中的字元和數字範圍 (0 到 9)。

對於每個字元-數字對,它檢查該字元是否已對映到不同的數字,或者該數字是否已對映到不同的字元。如果滿足任一條件,則返回 `False`。如果所有對的對映都有效,則返回 `True`。

def is_bijection(sequence):
   char_to_digit = {}
   digit_to_char = {}
   for char, digit in zip(sequence, range(10)):
      if char in char_to_digit and char_to_digit[char] != digit:
         return False
      if digit in digit_to_char and digit_to_char[digit] != char:
         return False
      char_to_digit[char] = digit
      digit_to_char[digit] = char
   return True
print(is_bijection("abc123")) 
print(is_bijection("abc122"))

輸出

True
False

更新於:2023年8月7日

瀏覽量 178 次

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.