使用子列表创建数字不重复的新列表

Using sublists to create new lists where numbers don't repeat

给定一个列表:

g = [[0, 7], 
     [1, 2, 10, 19],
     [3, 4, 5, 6, 15, 21, 24, 27],
     [0, 7, 8, 9, 12, 17],
     [1, 10, 11, 20],
     [8, 12, 13, 18],
     [14, 25],
     [3, 15, 16, 22],
     [9, 13, 17, 18]]

我想检查子列表中的数字,以便对于存在于多个子列表中的任何数字,两个子列表可以合并形成一个新列表,例如[8, 12, 13, 18][9, 13 ,17, 18] 可以组合成 [8, 9, 12, 13, 17, 18]。注意:数字不重复,我想列出尽可能多的列表。

我写了下面的代码,但是还不完善,重复也没有消除,谁能帮忙吗?

for i in g:
    for j in g:
        for k in i:
            for l in j:
                if k  == l:
                    m=list(set(i + j))
                    if m not in n:
                        n.append(m)

我的预期输出是:

[[0, 7, 8, 9, 12, 13, 17, 18],
 [1, 2, 10, 11, 19, 20],
 [3, 4, 5, 6, 15, 16, 21, 22, 24, 27],
 [25, 14]]

从您的初始列表列表开始:

>>> g = [[0, 7], 
         [1, 2, 10, 19],
         [3, 4, 5, 6, 15, 21, 24, 27],
         [0, 7, 8, 9, 12, 17],
         [1, 10, 11, 20],
         [8, 12, 13, 18],
         [14, 25],
         [3, 15, 16, 22],
         [9, 13, 17, 18]]

在你完成的过程中,我认为你想要的是将列表其余部分中所有匹配的子列表合并到当前子列表中,然后将它们从原始列表中删除:

>>> for start_index, start in enumerate(g):
    while True:
        for end_index, end in enumerate(g[start_index+1:],
                        start_index+1):
            if any(x == y for x in start for y in end):
                g[start_index].extend(end)
                del g[end_index]
                break
        else:
            break


>>> g
[[0, 7, 0, 7, 8, 9, 12, 17, 8, 12, 13, 18, 9, 13, 17, 18], 
 [1, 2, 10, 19, 1, 10, 11, 20], 
 [3, 4, 5, 6, 15, 21, 24, 27, 3, 15, 16, 22], 
 [14, 25]]

那么你所要做的就是去掉重复项:

>>> [sorted(set(l)) for l in g]
[[0, 7, 8, 9, 12, 13, 17, 18], 
 [1, 2, 10, 11, 19, 20], 
 [3, 4, 5, 6, 15, 16, 21, 22, 24, 27], 
 [14, 25]]

这是相对低效的,但为您提供了一个增强的起点(例如,如果 startend 已经设置,start & end 可以替换 any).