You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:15:41