Как объединить подсписки, только если они имеют общее значение?

У меня есть подсписки, заполненные их собственными подсписками. Если под-подсписки имеют общее значение в индексе 1, то я хотел бы объединить два подсписка в один, объединив/объединив элементы в под-подсписках, чтобы создать один под-подсписок.

l = [[
        ['Sublist1','AAA','10','Apple,Pear,Banana'],
        ['Sublist1','AAA','50','Peach,Orange,Banana'],
        ['Sublist1','DDD','3','Bike,Street']
    ],[
        ['Sublist2','CCC','50','Tomator,Lemmon'],
        ['Sublist2','EEE','30','Phone,Sign'],
        ['Sublist2','CCC','90','Strawberry'],
        ['Sublist2','FFF','30','Phone,Sign']
    ],[
        ['Sublist3','BBB','100','Tomator,Lemmon'],
        ['Sublist3','BBB','100','Pear'],
        ['Sublist3','FFF','90','Strawberry'],
        ['Sublist3','FFF','50','']
    ]]

Например, если вложенные подсписки имеют одинаковый AAA в индексе 1, объедините элементы в индексах 2 и 3. В этом случае 10 и 50 станут «10, 50», а «Яблоко, груша, банан» и «Персик, Апельсин, банан» станет «яблоком, грушей, бананом, персиком, апельсином, бананом».

Desired_Result = [[
        ['Sublist1','AAA','10,50','Apple,Pear,Banana,Peach,Orange'],
        ['Sublist1','DDD','3','Bike,Street']
    ],[
        ['Sublist2','CCC','50,90','Tomator,Lemmon,Strawberry'],
        ['Sublist2','EEE','30','Phone,Sign'],
        ['Sublist2','FFF','30','Phone,Sign']
    ],[
        ['Sublist3','BBB','100,100','Tomator,Lemmon,Pear'],
        ['Sublist3','FFF','90,50','Strawberry']
    ]]

person Chris    schedule 05.02.2014    source источник
comment
Для чего-то такого конкретного действительно нет правильного ответа. Есть много способов реализовать это. Я предлагаю перейти к чертежной доске и придумать несколько алгоритмов, выбрать лучший и опубликовать его в CodeReview для обратной связи.   -  person samrap    schedule 06.02.2014
comment
Должен ли он быть с тем же индексом? Вы можете превратить подсписки в sets, а затем использовать .intersection(), чтобы увидеть, чем они делятся. в общем. Но наборы уберут порядок.   -  person 2rs2ts    schedule 06.02.2014
comment
['FFF','30','Phone,Sign'] отсутствует 'Sublist2 намеренно?   -  person Ricardo Cárdenes    schedule 06.02.2014
comment
нет, это был несчастный случай.. извините за это   -  person Chris    schedule 06.02.2014


Ответы (1)


Вы можете попробовать это?

Я предположил, что в вашем образце l перед 'FFF' стоит 'Sublist2'.

def merge(lst):
    def j(sq):
        return ",".join(sq)
    def m(sl):
        dic = {}
        for ssl in sl:
            k = tuple(ssl[0:2])
            try:
                v = dic[k]
            except KeyError:
                dic[k] = v = (set(), set())
            v[0].update( set(ssl[2].split(',')) )
            v[0].discard('')
            v[1].update( set(ssl[3].split(',')) )
            v[1].discard('')
        return [ list(k) + [j(v[0])] + [j(v[1])] for k, v in sorted(dic.iteritems()) ]
    return [ m(sl) for sl in lst ]

for sl in merge(l):
    print sl
person nodakai    schedule 06.02.2014