Python中itemgetter和groupby有趣的结合使用

这两天, 新入职公司, 看了一段代码实现挺有意思的, 主要用到了itemgetter和groupby这两个方法, 在这里分享, 记录一下
先说一下, itemgetter方法, 下面是文档注释, 翻译过来看一下

在这里插入图片描述

# 先按照中文翻译做个Demo试一下
r = [1, 2, 3, 4]
f = itemgetter(2)
g = itemgetter(0)
print(f(r))
print(g(r))
# 结果如下:
3
1
# 可见这个函数的功能是给定索引, 根据索引取值, 跟列表的index()方法正好是相反的功能(list.index(值对应的索引))
# 结合列表的sort(对象直排序, 无返回值), sorted(排序之后, 返回新的对象, 原对象不变)
itemgetter排序
list1 = [
    {'spec': 'D', 'serial_num': 4, 'no': '3'},
    {'spec': 'B', 'serial_num': 3, 'no': '2'},
    {'spec': 'C', 'serial_num': 1, 'no': '4'},
    {'spec': 'A', 'serial_num': 2, 'no': '1'},
]
list2 = sorted(list1, key=itemgetter('spec'))
print(list2)  # 列表中的字典按照指定的键排序
list3 = sorted(list1, key=lambda r: r['spec'])
print(list3)  # 效果同上
list1.sort(key=itemgetter('spec', 'serial_num', 'no'))  # 先按照sepc, 再serial_num, 再no, 相当于mysql中的排序
print(list1)
# 结果感兴趣的, 结果自己打印试试
扩展兴趣
print(min(list1, key=itemgetter('no')))
print(max(list1, key=itemgetter('no')))
# 感兴趣的结果自己试试
接下来是groupby, 老规矩, 先看文档注释, 上图

在这里插入图片描述

试试看吧
list1 = [
    {'spec': 'D', 'serial_num': 4, 'no': '3'},
    {'spec': 'B', 'serial_num': 3, 'no': '2'},
    {'spec': 'C', 'serial_num': 1, 'no': '4'},
    {'spec': 'A', 'serial_num': 2, 'no': '1'},
]


def func(h):
    if h['serial_num'] > 2:
        return '大'
    else:
        return '小'


for k, value in groupby(list1, key=func):
    print(k)
    print(list(value))

# 结果比较有意思如下[{'spec': 'D', 'serial_num': 4, 'no': '3'}, {'spec': 'B', 'serial_num': 3, 'no': '2'}][{'spec': 'C', 'serial_num': 1, 'no': '4'}, {'spec': 'A', 'serial_num': 2, 'no': '1'}]
写一段实际可能会用到的代码
from operator import itemgetter
from itertools import groupby


cage_no = [
    {'spec': 'A', 'serial_num': '1', 'no': 1},
    {'spec': 'D', 'serial_num': '1', 'no': 1},
    {'spec': 'C', 'serial_num': '3', 'no': 4},
    {'spec': 'B', 'serial_num': '3', 'no': 4},
    {'spec': 'A', 'serial_num': '4', 'no': 3},
    {'spec': 'D', 'serial_num': '4', 'no': 3},
    {'spec': 'C', 'serial_num': '2', 'no': 2},
    {'spec': 'B', 'serial_num': '2', 'no': 2},
    {'spec': 'A', 'serial_num': '4', 'no': 4},
    {'spec': 'D', 'serial_num': '4', 'no': 4},
    {'spec': 'C', 'serial_num': '1', 'no': 3},
    {'spec': 'B', 'serial_num': '1', 'no': 3},
    {'spec': 'A', 'serial_num': '2', 'no': 1},
    {'spec': 'D', 'serial_num': '2', 'no': 1},
    {'spec': 'C', 'serial_num': '3', 'no': 2},
    {'spec': 'B', 'serial_num': '3', 'no': 2},
]
cage_no1 = sorted(cage_no, key=itemgetter('spec', 'serial_num', 'no'))
print(cage_no1)  # 这个可能可以满足部分需求, 在不需要操作key的情况下
print('*' * 30)

# itemgetter和groupby结合使用的代码
cage_no.sort(key=itemgetter('spec'))
for k, v in groupby(cage_no, itemgetter('spec')):
    # print(k)
    # print(list(v))
    cage = list(v)
    cage.sort(key=itemgetter('serial_num'))
    for key, value in groupby(cage, itemgetter('serial_num')):
        # print(key)
        # print(list(value))
        ca = list(value)
        ca.sort(key=itemgetter('no'))
        for ke, va in groupby(ca, itemgetter('no')):
            print(ke)
            print(list(va))
# 感兴趣的跑跑看吧
总结: 也是刚接触到这两个函数, 感觉比较有意思, 写个随笔, 希望对新手有帮助(0.0)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值