我有一个可能的密码列表,我需要在这个列表中附加每个密码的简单转换。说我的 list 是
['sauce', 'banana']
我在这里展示了一系列的转换。
'a'-->'@'
's'-->'$'
然后我想将每个可能的转换添加到列表中。所以现在列表应该看起来像
['$auce', 's@uce', '$@uce', 'b@nana', 'ban@na',
'banan@', 'b@n@na', 'b@nan@,' 'ban@n@', 'b@n@n@']
我将如何在 Python 中做到这一点?
我首先尝试创建一个进行所有转换的函数。然后我把转换后的字符串和原来的字符串做了一个叉积。然而,这会导致很多重复,而且看起来有点hacky。
功能:
def symbolize(s):
options = {
'a': '@',
'S': '$'
}
copy = ''
for i in range(len(s)):
if s[i] in options:
copy += options[s[i]]
else:
copy += s[i]
return copy
然后是叉积:
for x in range(len(candidates)):
candidates += list(''.join(t) for t in itertools.product(
*zip(candidates[x], symbolize(candidates[x]))))
最佳答案
from itertools import product
def all_versions_of_word(word, alt_chars, skip_orig=True):
chars = [ch + alt_chars.get(ch, "") for ch in word]
combos = product(*chars)
if skip_orig and word: next(combos) # drop the first item
return ("".join(c) for c in combos)
def transform_passwords(passwords, alt_chars={"a":"@", "s":"$"}):
for word in passwords:
yield from all_versions_of_word(word, alt_chars)
运行方式
>>> list(transform_passwords(['sauce', 'banana']))
['s@uce',
'$auce',
'$@uce',
'banan@',
'ban@na',
'ban@n@',
'b@nana',
'b@nan@',
'b@n@na',
'b@n@n@']
关于python - 附加到 Python 列出每个列表项的所有可能的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28258048/