Python:通过替换其符号来创建字符串的所有衍生物
Posted
技术标签:
【中文标题】Python:通过替换其符号来创建字符串的所有衍生物【英文标题】:Python: create all derivatives of string by replacing its symbols 【发布时间】:2014-09-16 19:36:17 【问题描述】:我有一些这样的字典
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
中的单词顺序并不重要。
我觉得itertools
应该有一些简单的方法,但我看不到。
任何漂亮而漂亮的解决方案都将受到欢迎。
【问题讨论】:
【参考方案1】:当然,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']
【讨论】:
非常感谢你们所有人,伙计们!每个解决方案都收到了我的 +1,但这个也是最快的(在我看来也是最简单的)。【参考方案2】:这是一种方法。由于您希望允许非替换(例如,将“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']
【讨论】:
没有给出 OP 指定的结果。 @isedev:是的。它们的顺序不同,但他说这并不重要。【参考方案3】:只是为了好玩。没有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'
]
【讨论】:
以上是关于Python:通过替换其符号来创建字符串的所有衍生物的主要内容,如果未能解决你的问题,请参考以下文章