【问题标题】:How to merge lists with common elements in a list of lists?如何将列表与列表列表中的常见元素合并?
【发布时间】:2019-03-26 01:32:38
【问题描述】:

我正在尝试将所有列表合并到具有共同元素的列表列表中。我有一些工作代码。但是,它似乎在这个例子中被打破了:

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]]

【问题讨论】:

  • 能否详细说明合并的条件?您的代码的目的是仅检查每个列表的第一个元素。
  • 你的结果不是我运行它得到的输出。它看起来确实像图形连接的组件。
  • 我不认为你的结果是你从上面写的代码中得到的......

标签: python list merge


【解决方案1】:

我同意@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]]

【讨论】:

    【解决方案2】:

    你需要使用递归:

    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]]
    

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2021-10-29
      • 2019-05-22
      • 2022-01-02
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多