gpt4 book ai didi

python - 我怎样才能得到字符串的所有可能的 "leet"版本(带有可选替换)?

转载 作者:行者123 更新时间:2023-11-28 20:21:03 28 4
gpt4 key购买 nike

我写了一个简单的函数,将单词中的字母转换为它们的“leet”数字对应物。

def Leet(word):
letters = list(word.lower())
for n, letter, in enumerate(letters):
if letter == 'o':
letters[n]= '0'
elif letter == 'i':
letters[n]= '1'
elif letter == 'z':
letters[n]= '2'
elif letter == 'e':
letters[n]= '3'
elif letter == 'a':
letters[n]= '4'
elif letter == 's':
letters[n]= '5'
elif letter == 'g':
letters[n]= '6'
elif letter == 't':
letters[n]= '7'
elif letter == 'b':
letters[n]= '8'
return ''.join(letters)

所以当我输入'zit'时,程序将返回'217'

我的问题是,如何更改它以提供所有可能的结果('217''2it''z1t''zi7''21t' 等)?我读过有关 itertools 的内容,但我对如何将它应用到我的函数感到困惑。

最佳答案

首先观察到您可以缩短查找时间,如下所示:

REPLACE = { letter: str(index) for index, letter in enumerate('oizeasgtb') }

def Leet2(word):
letters = [ REPLACE.get(l, l) for l in word.lower() ]
return ''.join(letters)

REPLACE 看起来像:

{'a': '4', 'b': '8', 'e': '3', 'g': '6', 'i': '1', 
'o': '0', 's': '5', 't': '7', 'z': '2'}

REPLACE.get(l,l) 返回替换字母,如果没有替换字母则返回原始字母。

第二个观察结果是您真的不需要排列,排列是顺序的变化。 “217”的排列是:

>>> [ ''.join(p) for p in permutations('217') ]
['217', '271', '127', '172', '721', '712']

您真正需要的是一个列表的产品,该列表对给定字符位置的所有可能选择进行编码:

[('z', '2'), ('i', '1'), ('t', '7')]

如果我还展示了一个可能的列表,其中包含一些没有有效替换的字符,那么它的工作原理可能会更清楚。对于 'red' 例如:

[('r',), ('e', '3'), ('d',)]

现在我们需要这些选项的字符串连接乘积。把它们放在一起:

from itertools import product

def Leet2Combos(word):
possibles = []
for l in word.lower():
ll = REPLACE.get(l, l)
possibles.append( (l,) if ll == l else (l, ll) )
return [ ''.join(t) for t in product(*possibles) ]

print Leet2Combos('zit')
print Leet2Combos('red')

给予:

['zit', 'zi7', 'z1t', 'z17', '2it', '2i7', '21t', '217']
['red', 'r3d']

关于python - 我怎样才能得到字符串的所有可能的 "leet"版本(带有可选替换)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151145/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com