首页 > 解决方案 > 用字母替换数字并提供所有排列

问题描述

在将数字转换为可能的视觉相似字母时,我需要确定具有数字的字符串的所有可能字母组合。

使用字典:

number_appearance = {
       '1': ['l', 'i'],
       '2': ['r', 'z'],
       '3': ['e', 'b'],
       '4': ['a'],
       '5': ['s'],
       '6': ['b', 'g'] ,
       '7': ['t'],
       '8': ['b'], 
       '9': ['g', 'p'],
       '0': ['o', 'q']} 

我想编写一个函数来接受输入并创建所有可能的字母组合。例如:

text = 'l4t32'

def convert_numbers(text):
      return re.sub('[0-9]', lambda x: number_appearance[x[0]][0], text)

我希望输出是一个包含所有可能排列的列表:

['later', 'latbr', 'latbz', 'latez]

如果您只是从 中获取每个列表中的第一个字母,则上面的函数有效number_appearance,但我试图找出迭代所有可能组合的最佳方法。任何帮助将非常感激!

标签: pythonregexstringreplaceitertools

解决方案


作为您自己答案的升级,我建议以下内容:

    def convert_numbers(text):
        all_items = [number_appearance.get(char, [char]) for char in text]
        return [''.join(elem) for elem in itertools.product(*all_items)]

改进之处在于:

  • 它不会将文本转换为列表(没有必要)
  • 你不需要正则表达式
  • 如果您决定还想在数字之上添加其他字符,它仍然可以工作

推荐阅读