#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]]])]
Можете ли вы обработать содержимое списка оттуда?