Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 14, 2015 12:02:01

wedoca
Зарегистрирован: 2015-07-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

Добрый день.. помогите плиз пере собрать список

есть список

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)

Офлайн

#2 Авг. 14, 2015 12:48:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа со списками

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)



Офлайн

#3 Авг. 14, 2015 13:03:25

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Работа со списками

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])))



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Авг. 14, 2015 13:04:56)

Офлайн

#4 Авг. 14, 2015 13:05:44

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Работа со списками

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)

Офлайн

#5 Авг. 14, 2015 13:24:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа со списками

>>> 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]))))
>>>



Отредактировано py.user.next (Авг. 14, 2015 13:57:12)

Офлайн

#6 Авг. 14, 2015 15:19:16

wedoca
Зарегистрирован: 2015-07-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

Ребята огромное вам спасибо.. нужно было срочно.. поэтому применил самый первый вариант от FishHook

возьму на заметку, изучу под лупой все варианты..

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version