字符串与特定可变字符的组合
Combinations of a string with specific variable characters
如何收集字符串的组合,其中某些字符(但不是全部)是可变的?
换句话说,我有一个输入字符串和一个字符映射。字符映射指定了哪些字符是可变的,以及它们可以被替换成什么。然后该函数会产生所有可能的组合。
为了说明这一点,我正在尝试收集可能被 OCR 引擎误解的 OCR 输出字符串的可能变体。
示例输入:
"ABCD"
示例字符映射:
dict(
B=("X", "Z"),
D=("E")
)
预期输出:
[
"ABCD",
"ABCE",
"AXCD",
"AXCE",
"AZCD",
"AZCE"
]
您可以使用 itertools.product
:
>>> from itertools import product
>>> s = "ABCD"
>>> d = {"B": ["X", "Z"], "D": ["E"]}
>>> poss = [[c]+d.get(c,[]) for c in s]
>>> poss
[['A'], ['B', 'X', 'Z'], ['C'], ['D', 'E']]
>>> [''.join(p) for p in product(*poss)]
['ABCD', 'ABCE', 'AXCD', 'AXCE', 'AZCD', 'AZCE']
请注意,为了保持一致性,我制作了 d["D"]
列表而不是简单的字符串。
我自己的解决方案非常丑陋且非 Pythonic,但这里是:
def fuzzy_search(string, character_map):
all_variations = []
for i, character in enumerate(string):
if character in character_map:
character_variations = list(character_map[character])
character_variations.insert(0, character)
if i == len(string) - 1:
return [string[:-1] + variation for variation in character_variations]
for variation in character_variations:
sub_variations = fuzzy_search(string[i + 1:], character_map)
for sub_variation in sub_variations:
all_variations.append(string[:i] + variation + sub_variation)
return all_variations
return all_variations
map = dict(
B=("X", "Z"),
D=("E")
)
print fuzzy_search("ABCD", map)
输出:
['ABCD', 'ABCE', 'AXCD', 'AXCE', 'AZCD', 'AZCE']
我认为应该有比具有多个循环的递归函数更优雅的解决方案。
如何收集字符串的组合,其中某些字符(但不是全部)是可变的?
换句话说,我有一个输入字符串和一个字符映射。字符映射指定了哪些字符是可变的,以及它们可以被替换成什么。然后该函数会产生所有可能的组合。
为了说明这一点,我正在尝试收集可能被 OCR 引擎误解的 OCR 输出字符串的可能变体。
示例输入:
"ABCD"
示例字符映射:
dict(
B=("X", "Z"),
D=("E")
)
预期输出:
[
"ABCD",
"ABCE",
"AXCD",
"AXCE",
"AZCD",
"AZCE"
]
您可以使用 itertools.product
:
>>> from itertools import product
>>> s = "ABCD"
>>> d = {"B": ["X", "Z"], "D": ["E"]}
>>> poss = [[c]+d.get(c,[]) for c in s]
>>> poss
[['A'], ['B', 'X', 'Z'], ['C'], ['D', 'E']]
>>> [''.join(p) for p in product(*poss)]
['ABCD', 'ABCE', 'AXCD', 'AXCE', 'AZCD', 'AZCE']
请注意,为了保持一致性,我制作了 d["D"]
列表而不是简单的字符串。
我自己的解决方案非常丑陋且非 Pythonic,但这里是:
def fuzzy_search(string, character_map):
all_variations = []
for i, character in enumerate(string):
if character in character_map:
character_variations = list(character_map[character])
character_variations.insert(0, character)
if i == len(string) - 1:
return [string[:-1] + variation for variation in character_variations]
for variation in character_variations:
sub_variations = fuzzy_search(string[i + 1:], character_map)
for sub_variation in sub_variations:
all_variations.append(string[:i] + variation + sub_variation)
return all_variations
return all_variations
map = dict(
B=("X", "Z"),
D=("E")
)
print fuzzy_search("ABCD", map)
输出:
['ABCD', 'ABCE', 'AXCD', 'AXCE', 'AZCD', 'AZCE']
我认为应该有比具有多个循环的递归函数更优雅的解决方案。