这两天, 新入职公司, 看了一段代码实现挺有意思的, 主要用到了itemgetter和groupby这两个方法, 在这里分享, 记录一下
先说一下, itemgetter方法, 下面是文档注释, 翻译过来看一下
r = [1, 2, 3, 4]
f = itemgetter(2)
g = itemgetter(0)
print(f(r))
print(g(r))
3
1
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'))
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)
print('*' * 30)
cage_no.sort(key=itemgetter('spec'))
for k, v in groupby(cage_no, itemgetter('spec')):
cage = list(v)
cage.sort(key=itemgetter('serial_num'))
for key, value in groupby(cage, itemgetter('serial_num')):
ca = list(value)
ca.sort(key=itemgetter('no'))
for ke, va in groupby(ca, itemgetter('no')):
print(ke)
print(list(va))
总结: 也是刚接触到这两个函数, 感觉比较有意思, 写个随笔, 希望对新手有帮助(0.0)