Python字母数字映射赋值 多字符排列去重功能实现问题
字母数值分配
现有一套为字母分配对应数值的程序,单字母映射场景下运行正常:输入ABC时可正确输出[1,2,3],但处理多字母场景时存在异常,无法得到符合规则的结果。
多字母处理规则
- 优先校验双字母组合,第一步先生成输入字符串的所有排列,以输入
ABC为例,初始全排列如下:
ABC ACB BAC BCA CAB CBA
- 数值计算依赖两套映射表:
alphabet:单字母映射表alphabet1:双字母映射表- 匹配优先级:优先匹配双字母组合取值,剩余未匹配的单字符按单字母表取值。
- 排列拆分要求:以输入
ABC为例,所有排列需按优先匹配双字母的规则拆分为如下形式:
AB C AC B BA C BC A CB A
- 结果去重规则:各拆分项计算数值后,删除数值结果重复的项——仅拆分顺序不同但数值列表完全一致的属于重复项,例如
AB C与BA C数值均为[2,3]、BC A与CB A数值均为[4,1],去重后ABC的预期最终结果为:
AB C = [2,3] BC A = [4,1]
- 长字符串适配要求:逻辑需支持任意长度字符串处理:
- 例如
ABCD需递归匹配双字母组合后,剩余字符走单字母映射 - 重复字符场景下
ABAB输出为[2,2],ABABA输出为[2,2,1]
- 例如
现有实现代码
import itertools alphabet = { "A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q": 17, "R": 18, "S": 19, "T": 20, "U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z": 26, "": 0 } alphabet1 = { "AA": 1, "AB": 2, "BB": 3, "BC": 4, "CC": 5, "CD": 6, "DD": 7, "DE": 8, "EE": 9, "EF": 10, "FF": 11, "FG": 12, "GG": 13, "GH": 14, "HH": 15, "HI": 16, "II": 17, "IJ": 18, "JJ": 19, "JK": 20, "KK": 21, "KL": 22, "LL": 23, "LM": 24, "MM": 25, "MN": 26, "NN": 27, "NO": 28, "OO": 29, "OP": 30, "PP": 31, "PQ": 32, "QQ": 33, "QR": 34, "RR": 35, "RS": 36, "SS": 37, "ST": 38, "TT": 39, "TU": 40, "UU": 41, "UV": 42, "VV": 43, "VW": 44, "WW": 45, "WX": 46, "XX": 47, "XY": 48, "YY": 49, "YZ": 50, "ZZ": 51 } def gen_combination_values(n): comb_values = {} for i in range(n + 1): for product in itertools.product(alphabet.keys(), repeat=i): prod = list(product) prod.sort() value = 0 comb = "" for char in product: value += alphabet[char] comb += char try: comb_values[value].add(comb) except KeyError: comb_values[value] = set() comb_values[value].add(comb) print(comb_values) return comb_values def gematria(word): result = 0 for char in word: result += alphabet[char] return result def combinations_w(word): """returns all possible word with replacement by each letter value """ letters_values = [] for c in word: print(c) letters_values.append(alphabet[c]) word_poss = [] for l_value in letters_values: word_poss.append(list(values[l_value])) poss = [] for i in set(itertools.product(*word_poss)): poss.append("".join(i)) return poss if __name__ == '__main__': values = gen_combination_values(1) for i in combinations_w("JE"): print(i)
内容的提问来源于stack exchange,提问作者Honza Alt
相关产品推荐
相关产品推荐

