2013-03-26 6 views
3

Je mam essaie de regrouper la liste des détails suivants:déclaration Python Groupby

details = [('20130325','B'), ('20130320','A'), ('20130325','B'), ('20130320','A')] 

>>for k,v in itertools.groupby(details,key=operator.itemgetter(0)): 
>> print k,list(v) 

Et c'est la sortie avec la déclaration groupby ci-dessus:

20130325 [('20130325', 'B')] 

20130320 [('20130320', 'A')] 

20130325 [('20130325', 'B')] 

20130320 [('20130320', 'A')] 

Mais mon résultat attendu était:

20130325 [('20130325', 'B'),('20130325', 'B')] 

20130320 [('20130320', 'A'),('20130320', 'A')] 

Est-ce que je fais mal quelque part?

Répondre

7

Vous devez trier vos données Prénom:

details.sort(key=operator.itemgetter(0)) 

ou

fst = operator.itemgetter(0) 
itertools.groupby(sorted(details, key=fst), key=fst) 

 

groupes GroupBy enregistrements correspondants consécutifs ensemble.

Documentation:

Le fonctionnement de groupby() est similaire au filtre uniq sur Unix. Il génère une rupture ou un nouveau groupe chaque fois que la valeur de la fonction clé change (c'est pourquoi il est généralement nécessaire d'avoir trié les données en utilisant la même fonction clé). Ce comportement diffère de GROUP BY de SQL qui agrège les éléments communs indépendamment de leur ordre d'entrée.

1

Le projet toolz offre une groupby non-diffusion en continu

$ pip install toolz 
$ ipython 

In [1]: from toolz import groupby, first 

In [2]: details = [('20130325','B'), ('20130320','A'), ('20130325','B'), ('20130320','A')] 

In [3]: groupby(first, details) 
Out[3]: 
{'20130320': [('20130320', 'A'), ('20130320', 'A')], 
'20130325': [('20130325', 'B'), ('20130325', 'B')]}