itemgetter和groupby

 

一. itemgetter的使用方法

 itemgetter()返回一个指定列表下标或者字典键的函数,通过这个返回的函数作用到对象上,获得才能取得相应的值

 

 1. 排序字典列表的一个例子

from operator import itemgetter
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]

#按名来排序
rows_by_fname = sorted(rows, key=itemgetter('fname'))

#按UID排序
rows_by_uid = sorted(rows, key=itemgetter('uid'))

#也支持按多个条件排序
rows_by_flname = sorted(rows, key=itemgetter('fname', lname'))

 

2. itemgetter在一般列表中的用法

>>> from operator import itemgetter
>>> a = [10,20,30,40]
>>> x = itemgetter(1)
>>> x(a)
20
>>> y = itemgetter(1,0)
>>> y(a)
(20, 10)

 

 

3. itemgetter在元组中的用法,其中key为一个函数或者lambda函数,所以itemgetter可以用来当key的参数
>>> a = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

#按第二个域和第三个域进行排序
>>> sorted(a, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

#按第三个域方向排序
>>> sorted(a, key=itemgetter(2), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

 

 

 

 

二. 使用itertools.groupby() :对字典中的某一个字段分组

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 ADDISON', 'date': '07/02/2012'},
{'address': '4801 N BROADWAY', 'date': '07/01/2012'},
{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

from operator import itemgetter
from itertools import groupby
# Sort by the desired field first
rows.sort(key=itemgetter('date'))
# Iterate in groups
for date, items in groupby(rows, key=itemgetter('date')):
    print(date)
    for i in items:
        print(' ', i)

 

输出结果如下

07/01/2012
 {'date': '07/01/2012', 'address': '5412 N CLARK'}
 {'date': '07/01/2012', 'address': '4801 N BROADWAY'}
07/02/2012
 {'date': '07/02/2012', 'address': '5800 E 58TH'}
 {'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}
 {'date': '07/02/2012', 'address': '1060 W ADDISON'}
07/03/2012
 {'date': '07/03/2012', 'address': '2122 N CLARK'}
07/04/2012
 {'date': '07/04/2012', 'address': '5148 N CLARK'}
 {'date': '07/04/2012', 'address': '1039 W GRANVILLE'}

 

转载于:https://www.cnblogs.com/regit/p/9397197.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值