Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2013 09:45:08

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

как проще всего схлопнуть списки?

В списках начальном и конечном отличаются только последние элементы.

Т.е. в наличии несколько строк с одинаковыми элементами, где только последние элементы различаются.

Необходимо привести список списков к такому виду, чтобы те элементы которые отличаются были добавлены в 1 отдельный список.. те, которые совпадают - схлопнулись в 1, результирующий.

     # [
     # [elem1, ... comment11]
     # [elem1, ... comment12]
     # ...
     # [elem2, ... comment21]
     # ...
     # ]
     # [
     # [elem1, ... [comment11, comment12]]
     # [elem2, ... [comment21, ...]]
     # ...
     # ]



Офлайн

#2 Дек. 2, 2013 10:44:26

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

как проще всего схлопнуть списки?

set().intersection()



Офлайн

#3 Дек. 2, 2013 10:57:38

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

как проще всего схлопнуть списки?

FishHook
set().intersection()

>>> a = [1,2,3,4,6]
>>> b = [1,2,3,4,8]
>>> c = [0,1,2,3,5]
>>> d = [0,1,2,3,8]
>>> res = []
>>> res.append(a)
>>> res.append(b)
>>> res.append(c)
>>> res.append(d)

Разверните свою мысль, плз на этом примере.



Отредактировано ks (Дек. 2, 2013 10:57:56)

Офлайн

#4 Дек. 2, 2013 11:30:28

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

как проще всего схлопнуть списки?

Легко, только сначала Вы покажите, что должно получиться в итоге на том же самом примере.



Офлайн

#5 Дек. 2, 2013 12:30:20

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как проще всего схлопнуть списки?

from collections import defaultdict
d = defaultdict(set)
for (i, *x) in res:
    d[i] = d[i].union(set(x))
print(d)
defaultdict(<class 'set'>,{
  0: {1, 2, 3, 5, 8},
  1: {2, 3, 4, 6, 8}
})
Это py3, но на py2 аналогично.

Офлайн

#6 Дек. 2, 2013 12:57:36

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

как проще всего схлопнуть списки?

Как-то так можно:

from itertools import groupby
from operator import itemgetter
a = [1,2,3,4,6]
b = [1,2,3,4,8]
c = [0,1,2,3,5]
d = [0,1,2,3,8]
tmp = ((x[:-1], x[-1]) for x in (a, b, c, d))
for k, g in groupby(tmp, itemgetter(0)):
    k.append([x[-1] for x in g])
    print(k)



Отредактировано pyuser (Дек. 2, 2013 12:58:04)

Офлайн

#7 Дек. 2, 2013 13:20:20

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

как проще всего схлопнуть списки?

from itertools import groupby
data = [
    [1,2,3,4,8],
    [1,2,3,4,6],
    [0,1,2,3,5],
    [0,1,2,3,8]
]
def keyfunc(x):
    return x[:-1]
data.sort()
res = []
for k, g in groupby(data, keyfunc):
    k.append([x[-1] for x in g])
    res.append(k)
print res

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version