使用字典获取单词映射的所有结果
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']
我得到了这样一句话: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
:
>>> [ ''.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']