如何用Python列表推导式统计数字列表各首数字的出现次数?
用列表推导式统计列表中数字的首数字出现次数
嘿,我太懂这种感受了——列表推导式刚接触的时候确实比普通循环绕,尤其是找不到贴合初学者的例子,总觉得它是“看起来简洁但摸不着头脑”的语法糖!别担心,我来一步步帮你用列表推导式搞定这个需求,还会和你熟悉的常规循环对比,帮你理清思路。
首先,先快速回顾下你已经会的常规循环写法(方便对比):
my_list = [232, 379, 985, 384, 129, 197] counts = {} for num in my_list: # 提取首数字:转字符串取第一个字符,再转回整数 first_digit = int(str(num)[0]) # 更新计数 counts[first_digit] = counts.get(first_digit, 0) + 1 # 生成结果语句 for digit, count in counts.items(): print(f"有{count}个数字以{digit}开头。")
用列表推导式实现的步骤
列表推导式的核心是快速生成序列,所以我们可以把任务拆成两步:先提取所有首数字生成列表,再统计次数,最后生成结果语句——每一步都可以用简洁的写法完成:
1. 用列表推导式提取所有首数字
这一步是列表推导式最擅长的场景:遍历原列表,对每个元素做“提取首数字”的操作,直接生成新列表:
my_list = [232, 379, 985, 384, 129, 197] # 列表推导式:逐个处理每个数字,提取首数字 first_digits = [int(str(num)[0]) for num in my_list] # 输出:[2, 3, 9, 3, 1, 1]
2. 统计首数字的出现次数
统计次数属于聚合操作,单独用列表推导式做会比较繁琐(效率也不高),所以我们可以搭配Python内置的collections.Counter来高效完成——它专门用来统计可迭代对象中元素的出现次数:
from collections import Counter counts = Counter(first_digits) # 输出:Counter({3: 2, 1: 2, 2: 1, 9: 1})
如果不想导入模块,也可以用字典推导式(本质是列表推导式的变种,针对字典)来实现,不过效率会低一些(因为每次count()都会遍历整个列表):
counts = {digit: first_digits.count(digit) for digit in set(first_digits)}
3. 用列表推导式生成结果语句
最后,我们再用一次列表推导式,把统计结果转换成你需要的语句格式:
# 遍历counts的键值对,生成对应的字符串列表 result_statements = [f"有{count}个数字以{digit}开头。" for digit, count in counts.items()] # 打印所有语句 for stmt in result_statements: print(stmt)
完整代码整合
把所有步骤合并起来,就是这样:
from collections import Counter my_list = [232, 379, 985, 384, 129, 197] first_digits = [int(str(num)[0]) for num in my_list] counts = Counter(first_digits) result_statements = [f"有{count}个数字以{digit}开头。" for digit, count in counts.items()] for stmt in result_statements: print(stmt)
运行后会输出:
有2个数字以2开头。 有2个数字以3开头。 有1个数字以9开头。 有2个数字以1开头。
小提示
列表推导式的优势是简洁、高效地生成序列,但不是所有操作都适合硬套它。像统计次数这种聚合任务,搭配Counter是更合理的选择——既利用了列表推导式的简洁,又保证了代码的可读性和效率。
内容的提问来源于stack exchange,提问作者Shaken_not_stirred.
相关产品推荐
相关产品推荐

