すべてのローカル変数の代わりに辞書がいいでしょう:
reports_by_status = {'new': [],
'read': [],
'accepted': [],
'deined': [], # denied?
'resubmitted': []}
for report in reports:
d[report.status].append(report)
しかし、あなたはタイプミスをしました!status
変数に含まれるデータを使用してカテゴリを割り当てることで、それを防ぐとよいでしょう。
reports_by_status = {}
for report in reports:
if report.status not in reports_by_status:
reports_by_status[status] = []
reports_by_status[status].append(report)
これは一般的なパターンであるため、より適切にする方法がいくつかあります。
reports_by_status = {}
for report in reports:
reports_by_status.set_default(report.status, []).append(report)
しかし、より良いのはdefaultdictです:
from collections import defaultdict
by_status = defaultdict(list)
for report in reports:
by_status[report].append(report)
itertools.groupby
素晴らしいです、それは分類アクションをカプセル化します:
from itertools import groupby
by_status = {}
for category, group in groupby(reports, lambda x: x.status):
by_status[category] = list(group)
しかし今、私たちのループはmap()
-ish に見えるので、リスト内包表記を使用しましょう:
from itertools import groupby
dict([(k:list(v)) for k, v in groupby(reports, lambda x: x.status)])
次に、Python 2.7 を使用していることを思い出してください。したがって、辞書内包表記もあります。
from itertools import groupby
{k:list(v) for k, v in groupby(reports, lambda x: x.status)}
またはこれまでの私のお気に入り、
from itertools import groupby
from operator import attrgetter
{k:list(v) for k, v in groupby(reports, attrgetter('status'))}