[英]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)]
我会像这样分解问题:
首先,创建一个函数来替换给定的一组替换字母。 我的输入规范是一个字母序列,其中第一个字母是'0'
字符的替换,接下来是1
等。这允许我使用该序列中的索引来确定被替换的字符,同时生成一个普通序列而不是 dict 或其他复杂的结构。 为了进行替换,我将使用原始字符串的内置translate
方法。 这需要文档中描述的字典,我可以使用 dict 理解轻松构建它,或者使用提供的帮助方法str.maketrans
( str
类型的静态方法)。
使用itertools.product
生成这些序列。
使用列表理解为每个序列应用替换。
因此:
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.