如何高效统计字符串别名?Python collections.Counter优化实现
处理别名的高效计数方案
嘿,这个需求我之前做类似文本统计时也碰到过,用你说的映射结构完全能高效解决,核心思路是先把所有别名归一到主名,再用Counter统计,不用事后逐个相加,一步到位。
具体实现步骤:
- 构建反向映射字典:把你的
主名: 别名集合转换成别名: 主名的字典,这样每个别名(包括主名自己)都能快速找到对应的主名,这是实现高效处理的关键。 - 文本归一化:遍历文本中的每个名字,用反向映射把它转换成对应的主名;如果遇到不在映射里的词,可以选择保留原词或者忽略,看你的需求。
- 用Counter统计:直接对归一后的名字列表做计数,结果就是把所有别名的次数都归到主名下的统计结果。
代码示例:
from collections import Counter # 你的别名映射结构 name_mapping = { 'Tim': {'Tim', 'Timmy', 'Timster'}, 'Alice': {'Alice', 'Ali', 'Alicia'}, 'Bob': {'Bob', 'Bobby'} } # 第一步:构建反向映射 alias_to_main = {} for main_name, aliases in name_mapping.items(): # 把主名自己也加进去,避免漏统计原主名的出现 for alias in aliases: alias_to_main[alias] = main_name # 第二步:处理文本(这里假设已经分词成单词列表,实际可根据你的文本做分词处理) sample_text = "Timmy went to the park with Tim, later Timster joined Alice and Ali" text_words = sample_text.split() # 归一化每个词:找到对应的主名,找不到就保留原词 normalized_words = [alias_to_main.get(word, word) for word in text_words] # 第三步:统计计数 result_counter = Counter(normalized_words) print(result_counter)
输出结果:
Counter({'Tim': 3, 'Alice': 2, 'went': 1, 'to': 1, 'the': 1, 'park': 1, 'with': 1, ',': 1, 'later': 1, 'joined': 1, 'and': 1})
额外优化建议:
- 如果需要处理大小写问题(比如文本里有
tim或者TIMMY),可以在构建反向映射和处理文本时统一转成小写(或大写),比如:alias_to_main = {} for main_name, aliases in name_mapping.items(): for alias in aliases: alias_to_main[alias.lower()] = main_name # 处理文本时也转小写 normalized_words = [alias_to_main.get(word.lower(), word) for word in text_words] - 如果你的文本是大段未分词的内容,可能需要先做分词处理(比如用简单的正则匹配名字,或者专业的分词工具),但核心的归一化逻辑是一致的。
内容的提问来源于stack exchange,提问作者Vale
相关产品推荐
相关产品推荐

