繁体   English   中英

Python:通过替换字符串的符号来创建字符串的所有派生词

[英]Python: create all derivatives of string by replacing its symbols

我有这样的话

d = {'a' : ['1', '+', '='], 'b' : ['2'], c : ['3']}

我的目标是通过替换这样的元素来创建初始单词所有可能衍生词的列表:

word = 'abcde'
rez = ['abcde', 
       '1bcde', '+bcde', '=bcde', 
       'a2cde', '12cde', '+2cde', '=2cde', 
       'ab3de', '1b3de', '+b3de', '=b3de', 'a23de', '123de', '+23de', '=23de']

rez的单词rez并不重要。

我觉得itertools应该有一些简单的方法,但是我看不到。 任何好的解决方案都将非常受欢迎。

当然, itertools始终是此类问题的答案。 可能有更好的选择,但我想到的第一个选择是使用itertools.product

from itertools import product

[''.join(chars) for chars in product(*[[x] + d.get(x, []) for x in word])]

输出量

['abcde', 'ab3de', 'a2cde', 'a23de', '1bcde', '1b3de', '12cde', '123de',
 '+bcde', '+b3de', '+2cde', '+23de', '=bcde', '=b3de', '=2cde', '=23de']

这是一种方法。 由于要允许非替换(例如,将“ a”保留为“ a”),最好将原始字符包括在替换值列表中,以便字典具有例如'a': ['a', '1', '+', '='] 这可以通过以下方式完成:

for k in d:
    d[k].append(k)

然后:

subs = [[(k, v) for v in vs] for k, vs in d.iteritems()]  
rez = []
for comb in itertools.product(*subs):
    baseword = word
    for before, after in comb:
        baseword = baseword.replace(before, after)
    rez.append(baseword)

结果:

['123de', '1b3de', '12cde', '1bcde', '+23de', '+b3de', '+2cde', '+bcde', '=23de', '=b3de', '=2cde', '=bcde', 'a23de', 'ab3de', 'a2cde', 'abcde']

纯娱乐。 import ,不def ,无压痕。

d = {'a' : ['1', '+', '='], 'b' : ['2'], 'c' : ['3']}
for key in d: d[key].append(key)
print reduce(lambda items, f: sum(map(f, items), []), [lambda msg, c=c: [msg.replace(c, r) for r in d[c]] for c in d.keys()], ["abcde"])

结果:

[
    '123de', '1b3de', '12cde', '1bcde', 
    '+23de', '+b3de', '+2cde', '+bcde', 
    '=23de', '=b3de', '=2cde', '=bcde', 
    'a23de', 'ab3de', 'a2cde', 'abcde'
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM