расширить элемент, затем удалить элемент во вложенном списке в python

Я пытаюсь классифицировать вложенный список в python, у меня огромный список, и мне пока не удалось из-за ошибки индекса элемента. Моя цель состоит в том, что если два элемента в списке имеют один и тот же элемент, то расширить элемент 1 с помощью элемента 2 и удалить элемент 2. У меня недостаточно опыта работы с python. Я надеюсь, что вы можете помочь

My pseudo code

L = [[0, 1], [2, 3], [4, 5, 13], [6, 7], [2, 8],[3, 10, 11], [12, 13]]

for i in range(len(L)-1):
    for j in range(i+1,len(L)):
        if i!=j and set(L[i]) & set(L[j]) != set():
            L[i].extend(L[j])
            L.remove(L[j])

expected L = [[0,1], [6, 7], [2, 3, 2, 8, 3, 10, 11], [4, 5, 13, 12, 13]]

person HAKAN KÜÇÜK    schedule 27.09.2020    source источник
comment
Пожалуйста, обновите вопрос, чтобы показать пример ожидаемого результата.   -  person S3DEV    schedule 27.09.2020
comment
Большое спасибо, мой реальный список велик, и комбинации itertools потребляют много оперативной памяти и времени. Также в моих данных есть много похожих элементов случайным образом   -  person HAKAN KÜÇÜK    schedule 27.09.2020


Ответы (1)


L = [[0, 1], [2, 3], [4, 5, 13], [6, 7], [2, 8],[3, 10, 11], [12, 13]]

out = []
while L:
    current = L.pop(0)
    out.append(current)
    tmp = []    
    for v in L:
        if set(v).intersection(current):
            current.extend(v)
        else:
            tmp.append(v)
    L = tmp

print(out)

Отпечатки:

[[0, 1], [2, 3, 2, 8, 3, 10, 11], [4, 5, 13, 12, 13], [6, 7]]

РЕДАКТИРОВАТЬ: Версия 2:

L = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9],[10, 11], [1,3,5,7,9,11]] 
    
out = []
while L:
    current = L[0]
    while True:
        tmp = []
        for i, v in enumerate(L[1:], 1):
            if set(v).intersection(current):
                current.extend(L.pop(i))
                break
            else:
                tmp.append(v)
        else:
            break
    out.append(current)
    L = tmp

print(out)

Отпечатки:

[[0, 1, 1, 3, 5, 7, 9, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]

Для L = [[0, 1], [2, 3], [4, 5, 13], [6, 7], [2, 8],[3, 10, 11], [12, 13]] отпечатков:

[[0, 1], [2, 3, 2, 8, 3, 10, 11], [4, 5, 13, 12, 13], [6, 7]]
person Andrej Kesely    schedule 27.09.2020
comment
Спасибо, Андрей Кесели, ваш подход очень выдающийся, но если я возьму интересный список, как показано ниже, я не получу желаемого результата. L = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11], [1,3,5,7,9, 11]] - person HAKAN KÜÇÜK; 27.09.2020
comment
Большое спасибо Андрею Кеселю еще раз. Я пробовал, и я получил удовлетворительные результаты .. - person HAKAN KÜÇÜK; 28.09.2020