![](/img/trans.png)
[英]How to replace the first and last elements of strings in a list with all possible combinations of chars from another
[英]How to replace strings in list from a dictionary with all possible combinations
我想使用名为gRep1Map
的字典替换 lst 中列出的名为test1
的字符串。 它需要使用gRep1Map
中的字符返回所有可能的组合。 我得到了 output,但不是我想要的。 似乎无法真正找到实现这一目标的方法。
这是我的代码。
text = "Test1"
#Create dictionary
gReplMap = { 'a': '@', 'e': '3', 'i': '1', 'o': '0', 't': '+',
'A': '@', 'E': '3', 'I': '1', 'O': '0', 'T': '+',
}
lst = []
for old, new in gReplMap.items():
text = text.replace(old, new)
lst.append(text)
print(lst)
output 如下所示。
['Test1']
['Test1', 'T3st1']
['Test1', 'T3st1', 'T3st1']
['Test1', 'T3st1', 'T3st1', 'T3st1']
['Test1', 'T3st1', 'T3st1', 'T3st1', 'T3s+1']
['Test1', 'T3st1', 'T3st1', 'T3st1', 'T3s+1', 'T3s+1']
['Test1', 'T3st1', 'T3st1', 'T3st1', 'T3s+1', 'T3s+1', 'T3s+1']
['Test1', 'T3st1', 'T3st1', 'T3st1', 'T3s+1', 'T3s+1', 'T3s+1', 'T3s+1']
['Test1', 'T3st1', 'T3st1', 'T3st1', 'T3s+1', 'T3s+1', 'T3s+1', 'T3s+1', 'T3s+1']
['Test1', 'T3st1', 'T3st1', 'T3st1', 'T3s+1', 'T3s+1', 'T3s+1', 'T3s+1', 'T3s+1', '+3s+1']
但我希望它是这样的。
['test1', 'tes+1', 't3st1', 't3s+1', '+est1', '+es+1', '+3st1', '+3s+1']
有谁能帮忙吗?
您不应该遍历字典,而是遍历文本的字母。 这是一个不使用 itertools 的解决方案。
text = "Test1"
gReplMap = { 'a': '@', 'e': '3', 'i': '1', 'o': '0', 't': '+',
'A': '@', 'E': '3', 'I': '1', 'O': '0', 'T': '+'}
lst = [text]
#Iterate through each letter in each word in lst and update the lst
for string in lst:
for letter in string:
if letter in gReplMap:
new_string = string.replace(letter, gReplMap[letter])
if new_string not in lst:
lst.append(new_string)
print(lst)
( reduce
有用的罕见案例......)
from itertools import combinations
from functools import reduce
out = {
reduce(lambda x, y: x.replace(y[0], y[1]), repls, text)
for n in range(len(gReplMap) + 1)
for repls in combinations(gReplMap.items(), n)
}
生产:
>>> out
{'+3s+1', '+3st1', '+es+1', '+est1', 'T3s+1', 'T3st1', 'Tes+1', 'Test1'}
如果您希望按生成顺序查看不同的值,请使用dict
(具有插入顺序)并列出它:
out = list({
reduce(lambda x, y: x.replace(y[0], y[1]), repls, text): 1
for n in range(len(gReplMap) + 1)
for repls in combinations(gReplMap.items(), n)
})
然后:
>>> out
['Test1', 'T3st1', 'Tes+1', '+est1', 'T3s+1', '+3st1', '+es+1', '+3s+1']
注意:在您的原始问题的预期结果中, 'test1'
所有变体似乎都是小写的,但您的示例代码或问题文本似乎都没有指定这一点。 当然,如果你想要的话,在 reduce 之后使用.lower()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.