如何统计列表中单个数字出现次数?避免多位数误判问题
如何避免统计数字时的字符匹配误判?
这个问题很典型——把数字当作纯字符串处理时,很容易陷入这种“把多位数拆成单个字符统计”的误区。我给你两种靠谱的解决方案,你可以根据自己的场景选择:
方案一:将内容转换为整数列表后统计(推荐)
核心思路是把文件中的内容当作独立的数字元素处理,而不是纯字符串,从根源上避免字符拆分的问题:
from collections import Counter # 读取文件并转换为整数列表 with open("numbers.txt", "r") as f: numbers = [] for line in f: # 兼容两种常见格式:每行一个数字 或 一行内用空格分隔数字 line_nums = [int(num.strip()) for num in line.split() if num.strip().isdigit()] numbers.extend(line_nums) # 统计1-20每个数字的出现次数 num_counts = Counter(numbers) # 循环输出结果 for num in range(1, 21): print(f"数字{num}的出现次数: {num_counts.get(num, 0)}")
为什么这个方法有效?
我们把每个数字都转换成了整数类型,11会被识别为一个完整的数字对象,而不是两个1字符。统计时是针对整个数字的匹配,自然不会出现误判。
方案二:用正则匹配独立数字(字符串场景下的补救方法)
如果因为某些原因必须用字符串处理,可以借助正则表达式的单词边界特性,确保只匹配独立的目标数字:
import re # 可替换为你要统计的目标数字(比如"2""3"等) target_num = "1" count = 0 with open("numbers.txt", "r") as f: for line in f: # \b 表示单词边界,确保匹配的是单独的target_num,不会匹配多位数中的子字符 matches = re.findall(rf'\b{target_num}\b', line) count += len(matches) print(f"数字{target_num}的出现次数: {count}")
正则逻辑说明
\b会匹配非数字字符(或行首/行尾)与数字之间的边界,比如1在1 11中,只有第一个1会被匹配,11里的1因为前后都是数字,不满足单词边界,所以不会被统计。
内容的提问来源于stack exchange,提问作者Basic01x
相关产品推荐
相关产品推荐

