Python中itemgetter和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))
原文地址:https://www.cnblogs.com/liang715200/p/14842751.html