Как объединить списки с общими элементами в списке списков? - PullRequest
2 голосов
/ 26 марта 2019

Я пытаюсь объединить все списки в список списков, имеющих общие элементы. У меня есть рабочий код. Тем не менее, на этом примере, похоже, что-то сломалось:

def merge_subs(lst_of_lsts):
    res = []
    for row in lst_of_lsts:
        for i, resrow in enumerate(res):
            if row[0]==resrow[0]:
                res[i] += row[1:]
                break
            else:
                res.append(sorted(row))
    return sorted(res)

Ввод:

merge_subs([[1, 7, 3], [1, 7, 5], [2, 0, 4], [2, 0, 6], [3, 7, 1], [3, 7, 5], [4, 0, 2], [4, 0, 6], [5, 7, 1], [5, 7, 3], [6, 0, 2], [6, 0, 4]])

Мой результат:

[[0, 2, 4, 6], [1, 3, 5, 7], [3, 5, 7]]

но я должен получить:

[[0, 2, 4, 6], [1, 3, 5, 7]]

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Я согласен с @ Ajax1234, эту проблему можно решить с помощью рекурсии, а именно хвостовой рекурсии:

def merge(lists, results=None):

    if results is None:
        results = []

    if not lists:
        return results

    first = lists[0]
    merged = []
    output = []

    for li in lists[1:]:
        for i in first:
            if i in li:
                merged = merged + li
                break
        else:
            output.append(li)

    merged = merged + first
    results.append(list(set(merged)))

    return merge(output, results)

И результаты выглядят так:

>>> lists = [[1, 7, 3], [1, 7, 5], [2, 0, 4], [2, 0, 6], [3, 7, 1], [3, 7, 5], [4, 0, 2], [4, 0, 6], [5, 7, 1], [5, 7, 3], [6, 0, 2], [6, 0, 4]]
>>> merge(lists)
[[1, 3, 5, 7], [0, 2, 4, 6]]
0 голосов
/ 26 марта 2019

Вам нужно использовать рекурсию:

def group(d, _start, _c = [], _seen = [], _used=[]):
  r = [i for i in d if any(c in _start for c in i) and i not in _seen and i not in _used]
  if not r:
    yield set(_c)
    for i in d:
      if i != _start and i not in _used:
         yield from group(d, i, _c=[], _seen=[], _used=_used+[i, *r])
  else:
    yield from group(d, _start, _c=_c+[i for b in r for i in b], _seen=_seen+r, _used=_used+r)

data = [[1, 7, 3], [1, 7, 5], [2, 0, 4], [2, 0, 6], [3, 7, 1], [3, 7, 5], [4, 0, 2], [4, 0, 6], [5, 7, 1], [5, 7, 3], [6, 0, 2], [6, 0, 4]]
result = list(map(list, {tuple(i) for i in group(data, data[0], _seen=[data[0]]) if i}))

Выход:

[[0, 2, 4, 6], [1, 3, 5, 7]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...