Python毎日練習0010
7556 ワード
に質問
辞書またはインスタンスのシーケンスがあり、特定のフィールドに基づいて反復アクセスをグループ化したい場合.
ソリューション
次の辞書のリストがあるとします.
しゅつりょく
ディスカッション
さらに、
ソース
Python Cookbook
に注目
私の微信の公衆番号に注目してください:pythonは毎日練習します
辞書またはインスタンスのシーケンスがあり、特定のフィールドに基づいて反復アクセスをグループ化したい場合.
ソリューション
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は毎日練習します