私はこれにセットを使用します:
In [9]: set("aabbcc")
Out[9]: set(['a', 'c', 'b'])
In [10]: set(zip("aabbcc", [1, 1, 5, 5, 2, 2]))
Out[10]: set([('a', 1), ('c', 2), ('b', 5)])
マッピングが全射である場合に限り、2番目のセットの長さは最初のセットと等しくなります。(そうでない場合は、2番目のセットの同じ番号にマッピングされた文字のコピーが2つあります。その逆も同様です)
これがアイデアを実装するコードです
def is_bijection(seq1, seq2):
distinct1 = set(seq1)
distinct2 = set(seq2)
distinctMappings = set(zip(seq1, seq2))
return len(distinct1) == len(distinct2) == len(distinctMappings)
これは、一方のシーケンスがもう一方のシーケンスよりも短いが、有効なマッピングがすでに確立されている場合にもtrueを返します。シーケンスが同じ長さでなければならない場合は、そのチェックを追加する必要があります。