Pythonのcollectionモジュール及びnamedtupleの詳細

12215 ワード

転載元:http://www.zlovezl.cn/articles/collections-in-python/
Pythonは「電池内蔵」のプログラミング言語として、標準ライブラリの中に非常に多くの使いやすいモジュールを持っています.例えば今日は皆さんに紹介したいです. コレクション とてもいい例です.
基本的な紹介
私達はすべて知っています.Pythonはいくつかの内蔵データタイプを持っています.例えば、str、int、list、tuple、dictなどです.collectionモジュールはこれらの内蔵データタイプに基づいて、いくつかの追加データタイプを提供しています.
  • namedtuple():要素コンテンツに名前を用いてアクセスできるtupleサブクラス
  • を生成する.
  • deque:双端列は、他の側から素早くオブジェクトを追加して押し出すことができます.
  • カウンタ、主に
  • をカウントします.
  • OrderedDict:規則辞書
  • defaultdict:標準値付き辞書
  • namedtuple()
    namedtupleは、主に名前を使用して要素にアクセスできるデータオブジェクトを生成するために使用され、通常はコードの読み取り可能性を高めるために使用され、いくつかのtupleタイプのデータにアクセスする時に特に使いやすい.
    くりを一つあげる
    # -*- coding: utf-8 -*-
    """
                     ,             tuple。
      namedtuple          tuple                 。
    """
    from collections import namedtuple
    
    websites = [
        ('Sohu', 'http://www.google.com/', u'   '),
        ('Sina', 'http://www.sina.com.cn/', u'   '),
        ('163', 'http://www.163.com/', u'  ')
    ]
    
    Website = namedtuple('Website', ['name', 'url', 'founder'])
    
    for website in websites:
        website = Website._make(website)
        print website
    
    
    # Result:
    Website(name='Sohu', url='http://www.google.com/', founder=u'\u5f20\u671d\u9633')
    Website(name='Sina', url='http://www.sina.com.cn/', founder=u'\u738b\u5fd7\u4e1c')
    Website(name='163', url='http://www.163.com/', founder=u'\u4e01\u78ca')
    
    deque
    dequeは実は doub-ended queue 列の頭から素早くオブジェクトを追加して取り出すことができるのが最大の利点です. .popleft() .アプリ() .
    原生のリストも頭からオブジェクトを追加して取り出すことができるということですか?このように:
    l.insert(0, v)
    l.pop(0)
    
    しかし、注目すべきは、リストオブジェクトのこの2つの用法の時間複雑さは O(n) ,つまり、元素の数が増えるにつれて、消費時間が直線的に上昇するということです.dequeオブジェクトを使うと O(1) 複雑さがありますので、コードにこのような要求がある時は、必ずdequeを使用してください.
    デュアルエンド行列として、dequeは他のいくつかの好適な方法を提供しています. rotate など
    くりを一つあげる
    # -*- coding: utf-8 -*-
    """
                ,     deque rotate            
         
    """
    import sys
    import time
    from collections import deque
    
    fancy_loading = deque('>--------------------')
    
    while True:
        print '\r%s' % ''.join(fancy_loading),
        fancy_loading.rotate(1)
        sys.stdout.flush()
        time.sleep(0.08)
    
    # Result:
    
    #           
    ------------->-------
    
    カウンター
    カウンタは非常に一般的な機能需要であり、collectionも心を込めてこの機能を提供します.
    くりを一つあげる
    # -*- coding: utf-8 -*-
    """
              Counter                  
    """
    from collections import Counter
    
    s = '''A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'''.lower()
    
    c = Counter(s)
    #          5   
    print c.most_common(5)
    
    
    # Result:
    [(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]
    
    OrderedDict
    Pythonでは、dictというデータ構造はhashの特性のために無秩序であり、これは時々私たちに迷惑をかけます.幸いにも、collectionモジュールはOrderedDictを提供してくれました.きちんとした辞書の対象を得るために、それを使って正しいです.
    くりを一つあげる
    # -*- coding: utf-8 -*-
    from collections import OrderedDict
    
    items = (
        ('A', 1),
        ('B', 2),
        ('C', 3)
    )
    
    regular_dict = dict(items)
    ordered_dict = OrderedDict(items)
    
    print 'Regular Dict:'
    for k, v in regular_dict.items():
        print k, v
    
    print 'Ordered Dict:'
    for k, v in ordered_dict.items():
        print k, v
    
    
    # Result:
    Regular Dict:
    A 1
    C 3
    B 2
    Ordered Dict:
    A 1
    B 2
    C 3
    
    defaultdict
    私達はすべて知っています.Python原生のデータ構造dictを使う時、もし d[key] このような方式でアクセスすると、指定されたキーが存在しない場合には、KeyErrが異常に投げ出されます.
    しかし、defaultdictを使用すると、デフォルトの工場法が導入された場合、存在しないkeyを要求すると、この工場法を使用してその結果をこのkeyのデフォルト値として使用します.
    # -*- coding: utf-8 -*-
    from collections import defaultdict
    
    members = [
        # Age, name
        ['male', 'John'],
        ['male', 'Jack'],
        ['female', 'Lily'],
        ['male', 'Pony'],
        ['female', 'Lucy'],
    ]
    
    result = defaultdict(list)
    for sex, name in members:
        result[sex].append(name)
    
    print result
    
    # Result:
    defaultdict('list'>, {'male': ['John', 'Jack', 'Pony'], 'female': ['Lily', 'Lucy']})
    
    参考資料
    上では、非常に簡単なcollectionモジュールの主な内容を紹介しました.主な目的は、それらを使う場所にあったら、それらを覚えて使ってもいいです.
    それらをより包括的かつ深く理解するためには、公式文書とモジュールのソースコードを読むことをお勧めします.
  • https://docs.python.org/2/library/collections.html#module-collection