Python毎日練習0010

7556 ワード

に質問
辞書またはインスタンスのシーケンスがあり、特定のフィールドに基づいて反復アクセスをグループ化したい場合.
ソリューションitertools.groupby()関数の使用
次の辞書のリストがあるとします.
rows = [
    {'address': '5412 N CLARK', 'date': '07/01/2012'},
    {'address': '5148 N CLARK', 'date': '07/04/2012'},
    {'address': '5800 E 58TH', 'date': '07/02/2012'},
    {'address': '2122 N CLARK', 'date': '07/03/2012'},
    {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
    {'address': '1060 W ADDISON', 'date': '07/02/2012'},
    {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
    {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]
dateフィールドに従ってグループ化され、itertools.groupby()を使用できます.
from itertools import groupby
from operator import itemgetter
rows.sort(key=itemgetter('date'))
for key, group in groupby(rows, key=itemgetter('date')):
    print(key)
    for item in group:
        print(4 * ' ', item)

しゅつりょく
07/01/2012
     {'address': '5412 N CLARK', 'date': '07/01/2012'}
     {'address': '4801 N BROADWAY', 'date': '07/01/2012'}
07/02/2012
     {'address': '5800 E 58TH', 'date': '07/02/2012'}
     {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}
     {'address': '1060 W ADDISON', 'date': '07/02/2012'}
07/03/2012
     {'address': '2122 N CLARK', 'date': '07/03/2012'}
07/04/2012
     {'address': '5148 N CLARK', 'date': '07/04/2012'}
     {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}

ディスカッションitertools.groupby反復器とオプションのkeyパラメータをkeyでグループ化し、keyがNoneであれば要素でグループ化するitertools.groupbyは、それぞれ異なるkeyと、keyに対応する要素のセットである反復オブジェクトを返します.
さらに、itertools.groupbyがパケットを要求する前に、反復器のすべての要素は、itertools.groupbyの実装に関連して秩序化されなければならない.itertools.groupby()は概ね実現される.
class groupby:
    # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
    def __init__(self, iterable, key=None):
        if key is None:
            key = lambda x: x
        self.keyfunc = key
        self.it = iter(iterable)
        self.tgtkey = self.currkey = self.currvalue = object()
    def __iter__(self):
        return self
    def __next__(self):
        while self.currkey == self.tgtkey:
            self.currvalue = next(self.it)    # Exit on StopIteration
            self.currkey = self.keyfunc(self.currvalue)
        self.tgtkey = self.currkey
        return (self.currkey, self._grouper(self.tgtkey))
    def _grouper(self, tgtkey):
        while self.currkey == tgtkey:
            yield self.currvalue
            try:
                self.currvalue = next(self.it)
            except StopIteration:
                return
            self.currkey = self.keyfunc(self.currvalue)

ソース
Python Cookbook
に注目
私の微信の公衆番号に注目してください:pythonは毎日練習します