2011-11-14 7 views
5

devo questi dati: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)] 

Quando faccio funzionare questo codice:

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

per list(group) ottengo:

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

che è quello che voglio .

Ma se io uso 1 invece di 0

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

al gruppo per il secondo numero di tuple, io ho soltanto:

list: [(1, 1, 5.0)] 

anche se ci sono altre tuple che hanno "1 "in quella posizione 1 (2).

risposta

12

itertools.groupby raccoglie insieme articoli contigui con la stessa chiave. Se si desidera che tutti gli elementi con la stessa chiave, è necessario ordinare prima self.data.

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

Avevo ordinato in precedenza sulla posizione zero. Quindi ho appena ordinato di nuovo prima di fare il groupby e funziona. self.data.sort (key = operator.itemgetter (1)) – user994165

10

Variante senza ordinamento (tramite dizionario). Dovrebbe essere migliore per quanto riguarda le prestazioni.

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

È tornato a postare la stessa cosa, non avevo letto la tua risposta! Questa è chiaramente la strada da percorrere :) –