Here are two cases. Both require the following imports:
import itertools
import operator
You'll be using itertools.groupby and either operator.attrgetter or operator.itemgetter.
For a situation where you're grouping by obj_1.some_attr == obj_2.some_attr
:
get_attr = operator.attrgetter('some_attr')
new_list = [list(g) for k, g in itertools.groupby(sorted(old_list, key=get_attr), get_attr)]
For a[some_index] == b[some_index]
:
get_item = operator.itemgetter(some_index)
new_list = [list(g) for k, g in itertools.groupby(sorted(old_list, key=get_item), get_item)]
Note that you need the sorting because itertools.groupby
makes a new group when the value of the key changes.
Note that you can use this to create a dict
like S.Lott's answer, but don't have to use collections.defaultdict
.
Using a dictionary comprehension (only works with Python 3+, and possibly Python 2.7 but I'm not sure):
groupdict = {k: g for k, g in itertools.groupby(sorted_list, keyfunction)}
For previous versions of Python, or as a more succinct alternative:
groupdict = dict(itertools.groupby(sorted_list, keyfunction))