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

2024-05-14 17:45:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

使用字典:

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中获取每个列表中的第一个字母,那么上面的函数就可以工作,但是我正在尝试找出迭代所有可能组合的最佳方法。任何帮助都将不胜感激


Tags: 函数字符串textnumberconvert列表字典def
3条回答

根据您自己的回答,我建议如下:

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方法。这需要一个描述为in the documentation的字典,我可以用dict理解或提供的helper方法str.maketrans(一种str类型的静态方法)轻松构建它

  2. Use ^{}生成这些序列

  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]

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

相关问题 更多 >

    热门问题