Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Из одного списка сделать два вложенных друг в друга. Python

#python #списки


Есть список в формате:

list = [["f1", "object1"],["f1", "object2"],["f2", "object3"],["f2", "object4"],]


Пытаюсь сделать следующим образом:

ll = []    
for g in groupby( sorted(list,key=lambda x:x[1]) ,key=lambda x:x[1]):
    ll.append(g[0])

    for i in g[1]:
        ll.append(i[0])


Но на выходе получаю не совсем то, что нужно. Получаю одномерный список следующего
формата:

list3 = ["f1", "object1", "object2", "f2", "object3", "object4"]


Мне необходимо его сгруппировать так, чтобы на выходе получался следующий формат

listGroup = [["f1", ["object1", "object2"]], ["f2", ["object3", "object4"]]]

    


Ответы

Ответ 1



in_l = [["f1", "object1"], ["f1", "object2"], ["f2", "object3"], ["f2", "object4"],] from collections import defaultdict temp_dict = defaultdict(list) for fn, objn in in_l: temp_dict[fn].append(objn) out_l = [list(item) for item in temp_dict.items()] print(out_l) # [['f1', ['object1', 'object2']], ['f2', ['object3', 'object4']]]

Ответ 2



Если через groupby, то: items = [["f1", "object1"], ["f1", "object2"], ["f2", "object3"], ["f2", "object4"]] # В одну строку: new_items = [[key, [x[1] for x in item_list]] for key, item_list in groupby(items, key=lambda x: x[0])] print(new_items) new_items = [] for key, item_list in groupby(items, key=lambda x: x[0]): new_items.append([key, [x[1] for x in item_list]]) print(new_items) Иначе можно сгруппировать элементы вручную через словарь: items = [["f1", "object1"], ["f1", "object2"], ["f2", "object3"], ["f2", "object4"]] from collections import OrderedDict key_by_item_list = OrderedDict() for key, value in items: if key not in key_by_item_list: key_by_item_list[key] = [] key_by_item_list[key].append(value) print(key_by_item_list) # OrderedDict([('f1', ['object1', 'object2']), ('f2', ['object3', 'object4'])]) # В одну строку: new_items = [[key, item_list] for key, item_list in key_by_item_list.items()] print(new_items) new_items = [] for key, item_list in key_by_item_list.items(): new_items.append([key, item_list]) print(new_items)

Ответ 3



Решение в стиле Pandas: import pandas as pd In [153]: df = pd.DataFrame(lst, columns=['c1','c2']) In [155]: df.groupby('c1')['c2'].apply(list).reset_index().values.tolist() Out[155]: [['f1', ['object1', 'object2']], ['f2', ['object3', 'object4']]] Пошагово: In [161]: df Out[161]: c1 c2 0 f1 object1 1 f1 object2 2 f2 object3 3 f2 object4 In [162]: df.groupby('c1')['c2'].apply(list) Out[162]: c1 f1 [object1, object2] f2 [object3, object4] Name: c2, dtype: object In [163]: df.groupby('c1')['c2'].apply(list).reset_index() Out[163]: c1 c2 0 f1 [object1, object2] 1 f2 [object3, object4] In [164]: df.groupby('c1')['c2'].apply(list).reset_index().values.tolist() Out[164]: [['f1', ['object1', 'object2']], ['f2', ['object3', 'object4']]]

Комментариев нет:

Отправить комментарий