首页 > 解决方案 > 对列表中的数据进行分组

问题描述

我现在正在学习 python,我正在尝试对列表中的数据进行分组

raw_list = [
    ['item3', [10, 10, 1]], 
    ['item4', [10, 10, 2]], 
    ['item7', [10, 10, 2]], 
    ['item8', [10, 10, 2]], 
    ['item2', [10, 10, 3]],
    ['item5', [10, 10, 4]],
    ['item1', [10, 10, 20]],
    ['item6', [10, 10, 20]],
    ['item9', [10, 10, 20]]
]

我正在尝试按嵌套列表中的第三个数字(1、2、3、4、20)进行分组:

group = [
    [
        ['item3', [10, 10, 1]]
    ],
    [
        ['item4', [10, 10, 2]], 
        ['item7', [10, 10, 2]], 
        ['item8', [10, 10, 2]]
    ],
    [
        ['item2', [10, 10, 3]]
    ],
    [
        ['item5', [10, 10, 4]]
    ],
    [
        ['item1', [10, 10, 20]],
        ['item6', [10, 10, 20]],
        ['item9', [10, 10, 20]]
    ]
]

我的代码:

raw_list.sort(key=lambda x: x[1][2])

group_list = list(i for i in itertools.groupby(raw_list, lambda x: x[1][2]))
print(group_list)

我认为它几乎可以工作,但我无法获得每个组的列表,因为它返回:

[(1, <itertools._grouper object at 0x019AB7D8>), (2, <itertools._grouper object at 0x019B8430>), (3, <itertools._grouper object at 0x019B8730>), (4, <itertools._grouper object at 0x039E1F10>), (20, <itertools._grouper object at 0x039E1F70>)]

标签: python

解决方案


你真的很亲近。itertools.groupby产生形式为(key, group)wheregroup是迭代器的元组。如果您将每个项目转换group为列表,您将拥有您想要的。

raw_list.sort(key=lambda x: x[1][2])

# Notice the change in the list comprehension
group_list = [list(g) for _, g in itertools.groupby(raw_list, lambda x: x[1][2])]

print(group_list)

输出以下列表(然后我对其进行了格式化)

[
    [
        ['item3', [10, 10, 1]]
    ],
    [
        ['item4', [10, 10, 2]],
        ['item7', [10, 10, 2]],
        ['item8', [10, 10, 2]]
    ],
    [
        ['item2', [10, 10, 3]]
    ],
    [
        ['item5', [10, 10, 4]]
    ],
    [
        ['item1', [10, 10, 20]],
        ['item6', [10, 10, 20]],
        ['item9', [10, 10, 20]]
    ]
]

推荐阅读