Найти - Пользователи
Полная версия: Работа со списками
Начало » Python для новичков » Работа со списками
1
wedoca
Добрый день.. помогите плиз пере собрать список

есть список
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]),
    ),
)
FishHook
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)
terabayt
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])))
ayb
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)
py.user.next
>>> 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]]]]
>>>

У ayb там лишняя группировка и не отсортированы они.
>>> result
(('journal A', ((2014, [1, 1, 1]), (2012, [1, 1, 1, 1]))), ('journal B', ((2012, [1, 1]), (2015, [1, 1, 1]))))
>>>
wedoca
Ребята огромное вам спасибо.. нужно было срочно.. поэтому применил самый первый вариант от FishHook

возьму на заметку, изучу под лупой все варианты..
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB