Python入门:统计指定范围内数字中各数位的出现次数
问题分析与解决:统计数位出现次数
问题需求
统计指定范围(start到finish)内所有数字中,0-9每个数位的出现次数,返回各数位对应次数的列表(注意:不是统计列表元素数量,也不是查找列表元素的子字符串匹配)。
你的代码问题所在
你当前代码的核心错误出在这一行:
counteddigits = [housenumbers.count(digit) for digit in digitstocount]
housenumbers是存储着每个数字字符串的列表(比如['125', '126']),list.count(digit)的作用是统计列表中完全等于digit的元素个数。例如你要统计'1'的次数,列表里没有元素是单独的'1',都是三位数的字符串,所以所有计数都返回0,这就是输出全0的原因。
你需要的是统计所有数字字符串中每个字符的出现次数,而非列表元素的匹配次数。
修正方案
这里提供两种直观的修正思路:
方案1:拼接成大字符串后统计
把范围内所有数字转换成字符串并拼接成一个完整的长字符串,再直接统计每个数位在长字符串中的出现次数:
def paint_letterboxes(start, finish): digitstocount = '0123456789' # 生成所有数字的字符串列表(保留你原来的打印需求) housenumbers = [str(num) for num in range(start, finish + 1)] print(housenumbers) # 拼接所有数字为一个大字符串 all_digits = ''.join(housenumbers) # 统计每个数位的出现次数 counteddigits = [all_digits.count(d) for d in digitstocount] print(counteddigits) paint_letterboxes(125,132)
方案2:逐个遍历数位累加计数
初始化一个长度为10的计数列表(对应0-9),遍历每个数字的每一位,逐个累加对应数位的计数:
def paint_letterboxes(start, finish): # 初始化0-9的计数,初始值都为0 counts = [0] * 10 housenumbers = [] for num in range(start, finish + 1): num_str = str(num) housenumbers.append(num_str) # 遍历当前数字的每一位字符 for digit_char in num_str: # 将字符转为整数作为索引,对应计数加1 digit = int(digit_char) counts[digit] += 1 print(housenumbers) print(counts) paint_letterboxes(125,132)
验证结果
运行上述任意一种代码,都会得到你预期的输出:
['125', '126', '127', '128', '129', '130', '131', '132'] [1,9,6,3,0,1,1,1,1,1]
内容的提问来源于stack exchange,提问作者Asia Noble
相关产品推荐
相关产品推荐

