Aquí hay dos casos. Ambos requieren las siguientes importaciones:
import itertools
import operator
Usted va a utilizar y, o bien itertools.groupbyoperator.attrgetter o operator.itemgetter.
Para una situación en la que estés agrupación por 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)]
Para 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)]
en cuenta que necesita la clasificación porque itertools.groupby
hace un nuevo grupo cuando el valor de la clave cambios.
Tenga en cuenta que puede usar esto para crear un dict
como respuesta de S. Lott, pero no tiene que utilizar collections.defaultdict
.
El uso de un diccionario por comprensión (sólo funciona con Python 3 +, y posiblemente Python 2.7, pero no estoy seguro):
groupdict = {k: g for k, g in itertools.groupby(sorted_list, keyfunction)}
Para versiones anteriores de Python, o como una alternativa más sucinta:
groupdict = dict(itertools.groupby(sorted_list, keyfunction))
_ "una lista que contiene tuplas (de la misma longitud) en lugar de objetos" _ ¿Esto significa ** una lista que contiene tuplas todas de la misma longitud **? En caso afirmativo, ¿cuál es el "atributo" en el que se agrupan las tuplas? - Por cierto, las tuplas son objetos, ¿verdad? – eyquem
@eyquem: 1. Sí; 2. las tuplas se agrupan en un cierto índice. El elemento en el índice es una cadena. 3. Creo que sí, pero no estoy seguro.:-) – Aufwind