如何以更Pythonic的方式编写Python2.7的storeType计数字典代码?
更Pythonic的代码改写方案
嘿,我来帮你优化这段统计代码!原代码的核心功能是统计不同storeType的出现次数并生成对应字典,但存在重复代码多、变量冗余的问题,咱们可以用更简洁、符合Python风格的方式实现:
问题分析
原代码的几个小问题:
- 手动初始化三个独立计数变量,后续新增类型时要改多处
- 多个
elif分支重复逻辑,不够灵活 - 最后构建字典时还写错了变量名(应该是
typeA而非dataStore这类)
方案一:用普通字典统一计数(最直观)
直接用字典来管理所有类型的计数,避免冗余变量和重复判断:
# 初始化要统计的类型及初始计数 count_dict = {'dataStore': 0, 'coverageStore': 0, 'remoteStore': 0} for item in counts: store_type = item['storeType'] # 只统计我们关心的类型,避免无关类型干扰 if store_type in count_dict: count_dict[store_type] += 1
这样一来,所有计数逻辑都集中在字典里,后续新增统计类型只需修改初始字典即可,不用加新的elif。
方案二:用collections.Counter(更简洁)
如果你的Python环境允许引入标准库,Counter是专门做计数的工具,代码会更短:
from collections import Counter # 先提取所有storeType的值 all_store_types = [item['storeType'] for item in counts] # 自动统计所有类型的出现次数 counter = Counter(all_store_types) # 只保留我们需要的三种类型,没有的话默认0 count_dict = { 'dataStore': counter.get('dataStore', 0), 'coverageStore': counter.get('coverageStore', 0), 'remoteStore': counter.get('remoteStore', 0) }
这种方式尤其适合需要统计多种类型的场景,Counter会帮你处理所有计数逻辑。
方案三:用字典推导式+生成器(一行式风格)
如果追求简洁的一行式写法,也可以这样:
count_dict = { store_type: sum(1 for item in counts if item['storeType'] == store_type) for store_type in ['dataStore', 'coverageStore', 'remoteStore'] }
不过这种方式会遍历counts三次(每个类型一次),如果counts数据量很大,性能会比前两种差一些,适合小数据量场景。
这些写法都比原代码更符合Python的"优雅、简洁"原则,也更容易维护~
内容的提问来源于stack exchange,提问作者user1919
相关产品推荐
相关产品推荐

