Группировать данные из списка

#python

#python

Вопрос:

Сейчас я изучаю 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>)]
  

Ответ №1:

Вы действительно близки. itertools.groupby выдает кортежи вида (key, group) , где group является итератором. Если вы преобразуете элементы из каждого 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]]
    ]
]
  

Ответ №2:

Вы должны составить список из генератора групп, а не из пары (2-кортеж).

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

Вывод:

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

Можете ли вы обработать содержимое списка оттуда?