使用字典获取单词映射的所有结果

Get ALL results of a word mapping with a dictionary

我得到了这样一句话:kfc

然后字典:{'k':'1', 'c':'3'}

我怎样才能得到这样的列表?

kfc, 1fc, kf3, 1f3

表示总会有2^n种可能,其中n是该词在字典中的键数。

P/s:我能想到的就是使用递归函数,但是我更喜欢非递归。

您可以使用 itertools.product。例如,让我们定义预赛:

>>> import itertools
>>> s = 'kfc'
>>> d = {'k':'1', 'c':'3'}

现在,让我们计算结果:

>>> [ ''.join(x) for x in itertools.product( *[(c, d.get(c)) if d.get(c) else c for c in s] ) ]
['kfc', 'kf3', '1fc', '1f3']

工作原理

首先,我们使用列表理解来获得我们需要考虑的可能性:

>>> [(c, d.get(c)) if d.get(c) else c for c in s]
[('k', '1'), 'f', ('c', '3')]

在上面的列表理解中,我们遍历字符串s中的每个字符c。对于每个 c,我们 assemble 的可能性是 (c, d[c]) 如果 d[c] 存在,或者只是 c 如果它不存在。

接下来,我们使用 itertools 创建所有可能的产品:

>>> list( itertools.product( *[(c, d.get(c)) if d.get(c) else c for c in s] ) )
[('k', 'f', 'c'), ('k', 'f', '3'), ('1', 'f', 'c'), ('1', 'f', '3')]

以上就是我们需要的答案。我们只需要使用 ''.join:

重新 assemble 字符串
>>> [ ''.join(x) for x in itertools.product( *[(c, d.get(c)) if d.get(c) else c for c in s] ) ]
['kfc', 'kf3', '1fc', '1f3']