如何不初始化字典,通过字典推导式统计列表重复值?
不用初始化字典实现列表元素频率统计的方法
首先明确说:可以不用提前初始化字典,但直接用普通的字典推导式没法完成累加计数——因为字典推导式是一次性生成所有键值对的,在构建过程中你没法引用正在生成的字典本身来做累加操作。不过有几种更合适的方式:
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
相关产品推荐
相关产品推荐

