Функция для прохождения по списку списков и поиска аналогов

Есть список, содержащий некоторое количество элементов - списков.

Списки внутри состоят из двух элементов – целых чисел, которые обозначают id товаров

  • (например, [[1102, 214], [214, 2007], [42, 315], [406, 2007], …]).

Каждая пара внутри – пара аналогов товаров. Считаем, что если товар 1 и товар 2 - аналоги (1102 и 214), товар 2 и товар 3 – аналоги (214, 2007), то и товар 1 является аналогом товара 3 (1102 аналог 2007), даже если этой пары нет в исходном списке. Товар 1, товар 2 и товар 3 назовем группой аналогов. Необходимо написать функцию на Python, которая на вход принимает список списков и выводит на экран наиболее полные группы аналогов в виде кортежей (комментарии к коду приветствуются).

Пример: имеется список:

lst = [[1102, 214], [214, 2007], [42, 315], [406, 2007], [100, 200], [315, 77]]

Ожидаемый вывод:

1102, 214, 2007, 406
42, 315, 77
100, 200

Пробовал пройти по списку циклом, но не очень понимаю как обращаться отдельно к индексам внутри списка, как логично построить условие. Буду рад любому дельному совету.


Ответы (1 шт):

Автор решения: Александр

Спасибо за ссылку. Завернул одно из решений в функцию:

def analog(l):
      
    out = []
    while len(l)>0:
        first, *rest = l
        first = set(first)
    
        lf = -1
        while len(first)>lf:
            lf = len(first)
    
            rest2 = []
            for r in rest:
                if len(first.intersection(set(r)))>0:
                    first |= set(r)
                else:
                    rest2.append(r)     
            rest = rest2
    
        out.append(first)
        l = rest
    
    # print(out)
    print('\n'.join(map(str, out)))

Вывод:

{214, 2007, 406, 1102}
{42, 315, 77}
{200, 100}
None
→ Ссылка