V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
codists
V2EX  ›  Python

翻译:《实用的 Python 编程》02_05_Collections

  •  
  •   codists ·
    codists · 2021-02-24 23:43:40 +08:00 · 1398 次点击
    这是一个创建于 1360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 中的 MSFTIBM 的多个条目是如何合并的。

    可以像字典一样使用 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列为你的睡前读物,以备后用。

    注:完整翻译见 https://github.com/codists/practical-python-zh

    2 条回复    2021-02-25 14:28:21 +08:00
    yangfan1999
        1
    yangfan1999  
       2021-02-25 08:56:35 +08:00
    已 star,学习学习。
    codists
        2
    codists  
    OP
       2021-02-25 14:28:21 +08:00
    @yangfan1999
    感谢支持,期待有机会与大佬多多交流。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2313 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:59 · PVG 08:59 · LAX 16:59 · JFK 19:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.