Форум сайта python.su
0
Добрый день.. помогите плиз пере собрать список
есть список
my_list = [ ['journal A', 2014, 1], ['journal A', 2014, 1], ['journal A', 2014, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal B', 2012, 1], ['journal B', 2012, 1], ['journal B', 2015, 1], ['journal B', 2015, 1], ['journal B', 2015, 1], ]
new_list = ( ('journal A', (2012, [1, 1, 1]), (2014, [1, 1, 1, 1]), ), ('journal B', (2012, [1, 1]), (2014, [1, 1, 1]), ), )
Отредактировано wedoca (Авг. 14, 2015 12:06:09)
Офлайн
568
from collections import defaultdict from operator import itemgetter my_list = [ ['journal A', 2014, 1], ['journal A', 2014, 1], ['journal A', 2014, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal B', 2012, 1], ['journal B', 2012, 1], ['journal B', 2015, 1], ['journal B', 2015, 1], ['journal B', 2015, 1], ] d = defaultdict(lambda: defaultdict(list)) keyorder = [] keyset = set() for item_group in my_list: key, year, value = item_group if not key in keyset: keyset.add(key) keyorder.append(key) d[key][year].append(value) result = [] for key in keyorder: rec = [key] for year, values in sorted(d[key].items(), key=itemgetter(0)): rec.append((year, values)) result.append(tuple(rec)) result = tuple(result)
Офлайн
103
import collections n = collections.defaultdict(lambda: collections.defaultdict(list)) for i0, i1, i2 in my_list: n[i0][i1].append(i2) print tuple([(i,) + tuple(j.items()) for i, j in n.items()])
>>> my_list = [ ... ['journal A', 2014, 1], ... ['journal A', 2014, 1], ... ['journal A', 2014, 1], ... ... ['journal A', 2012, 1], ... ['journal A', 2012, 1], ... ['journal A', 2012, 1], ... ['journal A', 2012, 1], ... ... ... ['journal B', 2012, 1], ... ['journal B', 2012, 1], ... ... ['journal B', 2015, 1], ... ['journal B', 2015, 1], ... ['journal B', 2015, 1], ... ] >>> import collections >>> n = collections.defaultdict(lambda: collections.defaultdict(list)) >>> print tuple([(i,) + tuple(j.items()) for i, j in {n[i0][i1].append(i2) or i0:n[i0] for i0, i1, i2 in my_list}.items()]) (('journal A', (2012, [1, 1, 1, 1]), (2014, [1, 1, 1])), ('journal B', (2012, [1, 1]), (2015, [1, 1, 1])))
Отредактировано terabayt (Авг. 14, 2015 13:04:56)
Офлайн
24
from itertools import groupby my_list = [ ['journal A', 2014, 1], ['journal A', 2014, 1], ['journal A', 2014, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal A', 2012, 1], ['journal B', 2012, 1], ['journal B', 2012, 1], ['journal B', 2015, 1], ['journal B', 2015, 1], ['journal B', 2015, 1], ] result = [] grouped_by_code = [(k, [x[1:] for x in v]) for k, v in groupby(my_list, key=lambda x: x[0])] for i in grouped_by_code: result.append((tuple([i[0], tuple([(k, [x[1] for x in v]) for k, v in groupby(i[1], key=lambda x:x[0])])]))) result = tuple(result)
Отредактировано ayb (Авг. 14, 2015 13:20:33)
Офлайн
857
>>> import itertools >>> >>> my_list = [ ... ['journal A', 2014, 1], ... ['journal A', 2014, 1], ... ['journal A', 2014, 1], ... ['journal A', 2012, 1], ... ['journal A', 2012, 1], ... ['journal A', 2012, 1], ... ['journal A', 2012, 1], ... ['journal B', 2012, 1], ... ['journal B', 2012, 1], ... ['journal B', 2015, 1], ... ['journal B', 2015, 1], ... ['journal B', 2015, 1], ... ] >>> >>> def f(lst): ... if len(lst[0]) == 1: ... return [sum(lst, [])] ... else: ... return [[i] + f([j[1:] for j in g]) for i, g in ... itertools.groupby(sorted(lst), lambda i: i[0])] ... >>> f(my_list) [['journal A', [2012, [1, 1, 1, 1]], [2014, [1, 1, 1]]], ['journal B', [2012, [1, 1]], [2015, [1, 1, 1]]]] >>>
>>> result (('journal A', ((2014, [1, 1, 1]), (2012, [1, 1, 1, 1]))), ('journal B', ((2012, [1, 1]), (2015, [1, 1, 1])))) >>>
Отредактировано py.user.next (Авг. 14, 2015 13:57:12)
Офлайн
0
Ребята огромное вам спасибо.. нужно было срочно.. поэтому применил самый первый вариант от FishHook
возьму на заметку, изучу под лупой все варианты..
Офлайн