zoukankan      html  css  js  c++  java
  • 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'}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    扩展:
    实用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()要快得多。
    ————————————————

  • 相关阅读:
    ios系统滚动穿透
    移动h5 开发遇到ios系统的各种问题汇总
    移动端选择时间时软键盘弹出问题
    ios系统设置-webkit-overflow-scrolling: touch导致z-index 失效 (弹窗层级设置无效)- 替代方案
    npm i 报错 npmERR! code Z_BUF_ERROR errno -5 // 后继 chromedriver.zip 相关问题报错解决
    mysql、orcale、sql server的区别
    jsp中的select选择
    sql面试
    java面试题
    struts2总结
  • 原文地址:https://www.cnblogs.com/valorchang/p/11475540.html
Copyright © 2011-2022 走看看