翻译:《实用的Python编程》02_05_Collections
2021-02-24 23:48
721 查看
目录 | 上一节 (2.4 序列) | 下一节 (2.6 列表推导式)
2.5 collections 模块
collections模块为数据处理提供了许多有用的对象。本部分简要介绍其中的一些特性。
示例:事物计数
假设要把每只股票的总份额表格化。
portfolio = [ ('GOOG', 100, 490.1), ('IBM', 50, 91.1), ('CAT', 150, 83.44), ('IBM', 100, 45.23), ('GOOG', 75, 572.45), ('AA', 50, 23.15) ]
此表中有两个
IBM条目,两个
GOOG条目,它们应该以某种方式合并到一起。
计数
解决方案:使用
Counter模块。
from collections import Counter total_shares = Counter() for name, shares, price in portfolio: total_shares[name] += shares total_shares['IBM'] # 150
示例:一对多映射
问题:把一个键映射到多个值。
portfolio = [ ('GOOG', 100, 490.1), ('IBM', 50, 91.1), ('CAT', 150, 83.44), ('IBM', 100, 45.23), ('GOOG', 75, 572.45), ('AA', 50, 23.15) ]
像之前的示例那样,键
IBM应具有两个不同的元组。
解决方案:使用
defaultdict模块。
from collections import defaultdict holdings = defaultdict(list) for name, shares, price in portfolio: holdings[name].append((shares, price)) holdings['IBM'] # [ (50, 91.1), (100, 45.23) ]
defaultdict模块确保每次访问键的时候获取到一个默认值。
示例:保留历史记录
问题:我们需要最近 N 件事的历史。
解决方案:使用
deque模块。
from collections import deque history = deque(maxlen=N) with open(filename) as f: for line in f: history.append(line) ...
练习
collections可能是最有用的库模块之一,用于解决特殊用途的数据处理问题,例如表格化或者索引化。
在本练习中,我们来看几个简单的例子。首先运行
report.py,以便在交互模式下能够加载股票投资组合。
bash % python3 -i report.py
练习 2.18:使用 Counter 模块表格化
假设需要将每支股票的份额总数表格化,那么使用
Counter对象会很容易。试试看:
>>> portfolio = read_portfolio('Data/portfolio.csv') >>> from collections import Counter >>> holdings = Counter() >>> for s in portfolio: holdings[s['name']] += s['shares'] >>> holdings Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95}) >>>
仔细观察
portfolio中的
MSFT和
IBM的多个条目是如何合并的。
可以像字典一样使用 Counter 模块检索单个值。
>>> holdings['IBM'] 150 >>> holdings['MSFT'] 250 >>>
如果想要对值排名,这样做:
>>> # Get three most held stocks >>> holdings.most_common(3) [('MSFT', 250), ('IBM', 150), ('CAT', 150)] >>>
让我们获取另一个股票投资组合并生成一个新的 Counter 对象:
>>> portfolio2 = read_portfolio('Data/portfolio2.csv') >>> holdings2 = Counter() >>> for s in portfolio2: holdings2[s['name']] += s['shares'] >>> holdings2 Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25}) >>>
最后,通过一个简单的操作把所有的 holdings 变量合并。
>>> holdings Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95}) >>> holdings2 Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25}) >>> combined = holdings + holdings2 >>> combined Counter({'MSFT': 275, 'HPQ': 250, 'GE': 220, 'AA': 150, 'IBM': 150, 'CAT': 150}) >>>
这只是对 Counter 功能的一个小尝试,如果发现需要对值进行表格化,那么就应该考虑使用它。
说明:collections 模块
collections模块是 Python 所有库中最有用的库模块之一。实际上,我们可以为此做一个拓展教程,但是,现在这样做会分散注意力。从现在开始,把
collections列为您的睡前读物,以备后用。
相关文章推荐
- WordProcessingML的解剖学翻译04--Wordprocessing段落02--属性05--底纹色 / 背景色
- 翻译:《实用的Python编程》02_06_List_comprehension
- 【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 第四章 依赖属性和路由事件 02
- 【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 第五章 元素 02
- WordProcessingML的解剖学翻译04--Wordprocessing段落02--属性06--间距
- [财经]国际煤价回落 广东煤炭进口复苏(05/02 18:56)
- Git学习05 --分支管理02
- 一个ModBus RTU程序(支持01、02、03、05、06、15、16功能码)
- [翻译]架构师应该知道的97件事_05架构决定性能
- 20170121C++阶段班05_STL_02inheritance补充
- 【翻译】--docker get started 02
- 翻译介绍15个经典的MDX查询-04&05
- 3 视频里weekend05、06、07的可靠性 + HA原理、分析、机制 + weekend01、02、03、04、05、06、07的分布式集群搭建
- 05_02_linux
- [05]-02java中的面向对象-Object类讲解
- NHibernate文档翻译 第5章 集合类(Collections)映射
- java学习之旅32--面向对象_05_程序执行过程的内存分析_02
- [国内]山东庆云非法加工鞭炮点爆炸已致9人死亡(05/02 20:20)
- 20170121C++阶段班05_STL_02inheritance补充
- 32_面向对象_05_程序执行过程的内存分析_02