上一个(2.4序列)|Next(2.6ListComprehensions)2.5集合模块集合模块为数据操作提供了许多有用的对象。本节简要介绍其中一些功能。示例:交易计数假设您要将每只股票的总份额制成表格。投资组合=[('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模块。fromcollectionsimportCountertotal_shares=Counter()forname,shares,priceinportfolio:total_shares[name]+=sharestotal_shares['IBM']#150示例:一对多映射问题:将一个键映射到多个值。投资组合=[('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模块。fromcollectionsimportdefaultdictholdings=defaultdict(list)forname,shares,priceinportfolio:holdings[name].append((shares,price))holdings['IBM']#[(50,91.1),(100,45.23)]defaultdict模块确保每次访问键时检索默认值。示例:保留历史问题:我们需要最近N件事的历史。解决方法:使用deque模块。fromcollectionsimportdequehistory=deque(maxlen=N)withopen(filename)asf:forlineinf:history.append(line)...练习集合可能是解决特殊用途数据最有用的库模块之一处理问题,例如制表或索引。在这个练习中,让我们看几个简单的例子。首先运行report.py以便可以以交互模式加载股票投资组合。bash%python3-ireport.py练习2.18:使用Counter模块制表假设您需要对每只股票的总股数进行制表,那么很容易使用Counter对象。试试这个:>>>portfolio=read_portfolio('Data/portfolio.csv')>>>fromcollectionsimportCounter>>>holdings=Counter()>>>forsinportfolio:holdings[s['name']]+=s['shares']>>>holdingsCounter({'MSFT':250,'IBM':150,'CAT':150,'AA':100,'GE':95})>>>仔细观察投资组合中MSFT和IBM的多个条目如何组合。可以使用Counter模块像字典一样检索单个值。>>>holdings['IBM']150>>>holdings['MSFT']250>>>如果要对值进行排序,请执行以下操作:>>>#获取三只持有最多的股票>>>holdings.most_common(3)[('MSFT',250),('IBM',150),('CAT',150)]>>>让我们采用另一个股票投资组合并生成一个新的Counter对象:>>>portfolio2=read_portfolio('Data/portfolio2.csv')>>>holdings2=Counter()>>>forsinportfolio2:holdings2[s['name']]+=s['shares']>>>holdings2Counter({'HPQ':250,'GE':125,'AA':50,'MSFT':25})>>>最后,通过简单的操作将所有持股变量组合起来。>>>holdingsCounter({'MSFT':250,'IBM':150,'CAT':150,'AA':100,'GE':95})>>>holdings2Counter({'HPQ':250,'GE':125,'AA':50,'MSFT':25})>>>combined=holdings+holdings2>>>combinedCounter({'MSFT':275,'HPQ':250,'GE':220,'AA':150,'IBM':150,'CAT':150})>>>这只是计数器功能的一小部分,如果您发现需要对值进行制表,则应予以考虑。说明:collections模块collections模块是所有Python库中最有用的库模块之一。我们实际上可以为此做一个扩展教程,但现在这样做会分散注意力。从现在开始,将收藏列为您的睡前读物,以备后用。目录|上一节(2.4序列)|NextSection(2.6ListComprehension)注:完整翻译见https://github.com/codists/practical-python-zh
