找到字符和数字之间的可能双射

Ehs*_*Kia 6 python list bijection

假设你有一个字符串S和一个列表L中的数字序列,len(S)= len(L).

检查是否可以在字符串的字符与序列中的数字之间找到双射,以使每个字符与一个且仅一个数字匹配,这是最干净的方法.

例如,"aabbcc"应与115522匹配,但不匹配123456或111111.

我有一个复杂的设置,有两个dicts和循环,但我想知道是否有一个干净的方法,可能通过使用Python库中的一些函数.

acj*_*jay 7

我会用一套:

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)])
Run Code Online (Sandbox Code Playgroud)

当且仅当映射是满射时,第二组的长度将等于第一组.(如果不是,你将有两个字母副本映射到第二组中的相同数字,反之亦然)

这是实现这个想法的代码

def is_bijection(seq1, seq2):
    distinct1 = set(seq1)
    distinct2 = set(seq2)
    distinctMappings = set(zip(seq1, seq2))
    return len(distinct1) == len(distinct2) == len(distinctMappings)
Run Code Online (Sandbox Code Playgroud)

如果一个序列比另一个序列短,则也将返回true,但是已经建立了有效的映射.如果序列长度必须相同,则应添加一个检查.

  • @EhsanKia几乎没有.它明确而简洁. (3认同)
  • 了解Python社区,实际上它可能比我做的还多。 (2认同)