Вот два случая.Оба требуют следующего импорта:
import itertools
import operator
Вы будете использовать itertools.groupby и либо operator.attrgetter или operator.itemgetter .
Для ситуации, когда вы группируете по 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)]
Для 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)]
Обратите внимание, что вам нужна сортировка, потому чтоitertools.groupby
создает новую группу при изменении значения ключа.
Обратите внимание, что вы можете использовать это, чтобы создать dict
как ответ С. Лотта, но не обязательно использовать collections.defaultdict
.
Использование словарного понимания (работает только с Python 3+,и, возможно, Python 2.7, но я не уверен):
groupdict = {k: g for k, g in itertools.groupby(sorted_list, keyfunction)}
Для предыдущих версий Python или в качестве более краткой альтернативы:
groupdict = dict(itertools.groupby(sorted_list, keyfunction))