2011-11-14 8 views
5

que tienen estos datos:itertools.groupby()

self.data = list: [(1, 1, 5.0), 
        (1, 2, 3.0), 
        (1, 3, 4.0), 
        (2, 1, 4.0), 
        (2, 2, 2.0), 
        (2, 3, 4.0), 
        (2, 5, 3.0), 
        (3, 2, 2.0), 
        (3, 4, 4.0), 
        (3, 5, 3.0)] 

Cuando ejecuto este código:

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(0)): 

para list(group) me sale:

list: [(1, 1, 5.0), 
     (1, 2, 3.0), 
     (1, 3, 4.0)] 

que es lo que yo quiero .

Pero si utilizo 1 en lugar de 0

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(1)): 

al grupo por el segundo número en las tuplas, solo me dan:

list: [(1, 1, 5.0)] 

a pesar de que hay otras tuplas que tienen "1 "en esa 1 (2da) posición.

Respuesta

12

itertools.groupby junta contigua elementos con la misma clave. Si desea todos los elementos con la misma clave, primero debe ordenar self.data.

for mid, group in itertools.groupby(
    sorted(self.data,key=operator.itemgetter(1)), key=operator.itemgetter(1)): 
+0

Había ordenado anteriormente en la posición cero. Así que solo ordené de nuevo antes de hacer groupby y funciona. self.data.sort (key = operator.itemgetter (1)) – user994165

10

Variante sin clasificación (a través del diccionario). Debería ser mejor en cuanto a rendimiento.

def full_group_by(l, key=lambda x: x): 
    d = defaultdict(list) 
    for item in l: 
     d[key(item)].append(item) 
    return d.items() 
+0

Volví para publicar lo mismo, ¡no había leído tu respuesta! Este es claramente el camino a seguir :) –