Python实用黑科技——以某个字段进行分组

需求:
当前有个字典实例,你想以某个字段比如”日期”对整个字典里面的元素进行分组。

方法:
itertools.groupby()函数是专门用来干这个活的。请看下面这个例子,这里有一个列表构成的字典,你想按照日期来对列表进行分组,可以这么做:

In [42]: from operator import itemgetter

In [43]: from itertools import groupby

In [44]: rows = [
    ...:         {'address' : '5412 N CLARK', 'date' : '07/01/2012'},
    ...:         {'address' : '5148 N CLARK', 'date' : '07/04/2012'},
    ...:         {'address' : '5800 E 58TH', 'date' : '07/02/2012'},
    ...:         {'address' : '2122 N CLARK', 'date' : '07/03/2012'},
    ...:         {'address' : '5645 N RAVENSWOOD', 'date' : '07/02/2012'},
    ...:         {'address' : '1060 W ADDISION', 'date' : '07/02/2012'},
    ...:         {'address' : '4801 N BROADWAY', 'date' : '07/01/2012'},
    ...:         {'address' : '1039 W GRANVILLE', 'date' : '07/04/2012'}
    ...: ]

In [45]: rows.sort(key=itemgetter('date'))

In [46]: for date, items in groupby(rows, key=itemgetter('date')):
    ...:     print(date)
    ...:     for i in items:
    ...:         print(' ', i)
    ...:         
07/01/2012
  {'address': '5412 N CLARK', 'date': '07/01/2012'}
  {'address': '4801 N BROADWAY', 'date': '07/01/2012'}
07/02/2012
  {'address': '5800 E 58TH', 'date': '07/02/2012'}
  {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}
  {'address': '1060 W ADDISION', 'date': '07/02/2012'}
07/03/2012
  {'address': '2122 N CLARK', 'date': '07/03/2012'}
07/04/2012
  {'address': '5148 N CLARK', 'date': '07/04/2012'}
  {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}

扩展:
实用groupby()函数前,必须对相应的要分组的字段进行排序,因为他只能对有序数据进行分组。如果你仅仅只是想针对日期进行分组并且允许随机获取,那可能更好的方法是实用defaultdict()先产生一个多维字典,例如:

In [48]: from collections import defaultdict

In [49]: rows_by_date = defaultdict(list)

In [50]: for row in rows:
    ...:     rows_by_date[row['date']].append(row)
    ...:     

In [51]: for r in rows_by_date['07/01/2012']:
    ...:     print(r)
    ...:     
{'address': '5412 N CLARK', 'date': '07/01/2012'}
{'address': '4801 N BROADWAY', 'date': '07/01/2012'}

对于这个例子,并不需要先对记录进行排序。因此如果不需要考虑内存,用这个方法比用groupby()要快得多。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值