为了账号安全,请及时绑定邮箱和手机立即绑定

如何将列表与列表列表中的公共元素合并?

如何将列表与列表列表中的公共元素合并?

元芳怎么了 2021-12-16 16:42:17
我正在尝试合并具有公共元素的列表列表中的所有列表。我有一些工作代码。但是,它似乎打破了这个例子: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 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

您需要使用递归:


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


查看完整回答
反对 回复 2021-12-16
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这个问题可以使用递归解决,特别是尾递归:


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


查看完整回答
反对 回复 2021-12-16
  • 2 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号