繁体   English   中英

用字母替换数字并提供所有排列

[英]Replace numbers with letters and offer all permutations

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

使用字典:

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获取每个列表中的第一个字母,则上述函数number_appearance ,但我正在尝试找出迭代所有可能组合的最佳方法。 任何帮助将非常感激!

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

    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)]

改进之处在于:

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

    for item in string_characters:
        if re.search('[a-zA-Z]', item):
           all_items.append([item])
        elif re.search('\d', item):
           all_items.append(number_appearance[item])

    return [''.join(elem) for elem in itertools.product(*all_items)]

我会像这样分解问题:

  1. 首先,创建一个函数来替换给定的一组替换字母。 我的输入规范是一个字母序列,其中第一个字母是'0'字符的替换,接下来是1等。这允许我使用该序列中的索引来确定被替换的字符,同时生成一个普通序列而不是 dict 或其他复杂的结构。 为了进行替换,我将使用原始字符串的内置translate方法。 这需要文档中描述的字典,我可以使用 dict 理解轻松构建它,或者使用提供的帮助方法str.maketransstr类型的静态方法)。

  2. 使用itertools.product生成这些序列。

  3. 使用列表理解为每个序列应用替换。

因此:

from itertools import product

def replace_digits(original, replacement):
    # translation = {ord(str(i)): c for i, c in enumerate(replacement)}
    translation = str.maketrans('0123456789', ''.join(replacement))
    print(translation)
    return original.translate(translation)

replacements = product(
   ['o', 'q'], ['l', 'i'], ['r', 'z'], ['e', 'b'], ['a'],
   ['s'], ['b', 'g'] , ['t'], ['b'], ['g', 'p']
)

[replace_digits('14732', r) for r in replacements]

(您会注意到结果中有重复项;这是因为未出现在输入中的符号的变体替换。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM