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

如何不初始化字典,通过字典推导式统计列表重复值?

不用初始化字典实现列表元素频率统计的方法

首先明确说:可以不用提前初始化字典,但直接用普通的字典推导式没法完成累加计数——因为字典推导式是一次性生成所有键值对的,在构建过程中你没法引用正在生成的字典本身来做累加操作。不过有几种更合适的方式:

1. 用Python标准库的Counter(最推荐)

这是Python官方为频率统计场景设计的工具,简洁高效,完全不需要手动初始化字典:

from collections import Counter

number_list = [1,1,2,2,3,3,4,4,5,5]
number_count_dict = Counter(number_list)
# 结果: {1:2, 2:2, 3:2, 4:2, 5:2}

Counter内部已经帮你处理了所有累加逻辑,而且时间复杂度是O(n),大数据量下比自己写推导式高效得多,返回的结果本身就是一个字典的子类,可以直接像普通字典一样使用。

2. 用字典推导式结合list.count()(纯推导式方案)

如果一定要用字典推导式的写法,可以先对列表去重,再用count()方法统计每个元素的出现次数,这样就不需要提前初始化字典:

number_list = [1,1,2,2,3,3,4,4,5,5]
number_count_dict = {num: number_list.count(num) for num in set(number_list)}

不过要注意:这个方法的时间复杂度是O(n²)——因为每个count()都会遍历整个列表一次。如果你的列表很大,这种写法会比Counter慢很多,所以只适合小数据量的场景。

为什么你的原尝试需要初始化字典?

你原来的代码里,第二个字典推导式依赖第一个初始化的number_count_dict,但其实这种写法是冗余的:第一个推导式把每个元素的值设为1,第二个推导式又遍历列表重复累加,相当于做了两次遍历。而且如果去掉第一个初始化的字典,直接在第二个推导式里写k: (current_dict[k]+1 if k in current_dict else 1)是行不通的——因为current_dict就是你正在构建的字典,推导式内部无法访问它。

内容的提问来源于stack exchange,提问作者nhamster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:02:53