Python特定前缀模式匹配计数与字典值求和问题求助
问题描述
给定列表:
hg = [['A1'], ['A1b'], ['A1b1a1a2a1a~'], ['BT'], ['CF'], ['CT'], ['F'], ['GHIJK'], ['I'], ['I1a2a1a1d2a1a~'], ['I2'], ['I2~'], ['I2a'], ['I2a1'], ['I2a1a'], ['I2a1a2'], ['I2a1a2~'], ['IJ'], ['IJK'], ['L1a2']]
需求1:前缀匹配次数统计
需要统计每个模式作为前缀在列表元素中的出现次数(包含自身),仅当模式是元素的前缀时才算匹配(例如A1匹配自身、A1b、A1b1a1a2a1a~,但元素E1b1a1中的A1不算)。
原代码存在逻辑错误,比如F被错误统计为2次(实际应为1次),原代码及输出如下:
原代码
dic_test = {} for i in hg: for j in hg: if ''.join(i) in ''.join(j): if ''.join(i) not in dic_test.keys(): dic_test[''.join(i)]=1 else: dic_test[''.join(i)]+=1 print (dic_test)
原代码输出
{'A1': 3, 'A1b': 2, 'A1b1a1a2a1a~': 1, 'BT': 1, 'CF': 1, 'CT': 1, 'F': 2, 'GHIJK': 1, 'I': 12, 'I1a2a1a1d2a1a~': 1, 'I2': 7, 'I2~': 1, 'I2a': 5, 'I2a1': 4, 'I2a1a': 3, 'I2a1a2': 2, 'I2a1a2~': 1, 'IJ': 3, 'IJK': 2, 'L1a2': 1}
需求2:前缀链求和
基于修正后的统计结果,对共享前缀链的字典值求和(例如A1b1a1a2a1a~对应的求和值为A1的次数+A1b的次数+自身次数=3+2+1=6),得到最终目标输出。
解决方案
修正需求1的统计代码
原代码错误在于使用in关键字匹配任意子串,而非仅前缀。改用str.startswith()方法可准确判断前缀关系:
hg = [['A1'], ['A1b'], ['A1b1a1a2a1a~'], ['BT'], ['CF'], ['CT'], ['F'], ['GHIJK'], ['I'], ['I1a2a1a1d2a1a~'], ['I2'], ['I2~'], ['I2a'], ['I2a1'], ['I2a1a'], ['I2a1a2'], ['I2a1a2~'], ['IJ'], ['IJK'], ['L1a2']] prefix_counts = {} # 提前转换为字符串,避免重复join操作 elements = [''.join(item) for item in hg] for pattern in elements: count = 0 for elem in elements: if elem.startswith(pattern): count += 1 prefix_counts[pattern] = count print(prefix_counts)
修正后输出
{'A1': 3, 'A1b': 2, 'A1b1a1a2a1a~': 1, 'BT': 1, 'CF': 1, 'CT': 1, 'F': 1, 'GHIJK': 1, 'I': 10, 'I1a2a1a1d2a1a~': 1, 'I2': 6, 'I2~': 1, 'I2a': 4, 'I2a1': 3, 'I2a1a': 2, 'I2a1a2': 2, 'I2a1a2~': 1, 'IJ': 3, 'IJK': 2, 'L1a2': 1}
可以看到F的次数已修正为1,I的次数从12变为10(原错误是匹配了GHIJK中的I,现在仅统计前缀为I的元素)。
实现需求2的前缀链求和
遍历每个元素,生成其所有可能的前缀候选,筛选出存在于统计结果中的前缀并求和:
chain_sums = {} elements = [''.join(item) for item in hg] for elem in elements: total = 0 # 生成当前元素的所有前缀(从短到长,直到自身) for i in range(1, len(elem)+1): prefix_candidate = elem[:i] if prefix_candidate in prefix_counts: total += prefix_counts[prefix_candidate] chain_sums[elem] = total print(chain_sums)
最终输出
{'A1': 3, 'A1b': 5, 'A1b1a1a2a1a~': 6, 'BT': 1, 'CF': 1, 'CT': 1, 'F': 1, 'GHIJK': 1, 'I': 10, 'I1a2a1a1d2a1a~': 11, 'I2': 16, 'I2~': 17, 'I2a': 20, 'I2a1': 23, 'I2a1a': 25, 'I2a1a2': 27, 'I2a1a2~': 28, 'IJ': 13, 'IJK': 15, 'L1a2': 1}
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

