在python中具有一个类似项的列表列表中合并列表

在python中具有一个类似项的列表列表中合并列表,python,string,list,Python,String,List,我有一个列表,其中包含字符串: list = [["a","b"],["c","d"],["a", "e"],["f","d"],["x","y"]] 现在,我想合并所有列表,其中包含1个类似项,如下所示: grouped_list = [["a", "b", "e"],["c","d","f"],["x","y"]] 我的代码如下: list = [["a","b"],["b","c"],["d","e"],["x","y"]] clist = list.copy() result

我有一个列表,其中包含字符串:

list = [["a","b"],["c","d"],["a", "e"],["f","d"],["x","y"]]
现在,我想合并所有列表,其中包含1个类似项,如下所示:

grouped_list = [["a", "b", "e"],["c","d","f"],["x","y"]]
我的代码如下:

 list = [["a","b"],["b","c"],["d","e"],["x","y"]]
 clist = list.copy()
 result = []
 counter = 0
 del_list = []
 def oneofsame(L1, L2):
     counter = 0
     for i in L1:
         for j in L2:
             if i == j:
                 counter += 1
     if counter == 0:
         return False
     else:
         return True

 for l in list:
     try:
         del clist[clist.index(l)]
     except:
         pass
     result.append([])
     for i in l:
         for cl in clist:
             if oneofsame(l, cl):
                 for j in l:
                     if j not in result[counter]:
                         result[counter].append(j)
                 for j in cl:
                     if j not in result[counter]:
                         result[counter].append(j)
                 del_list.append(cl)
             else:
                 result.append(cl)
                 del_list.append(cl)
             for j in del_list:
                 del clist[clist.index(j)]
             del_list = []     
     counter += 1

 del_list = []
 cresult = result.copy()
 for i in range(len(cresult)-1, 0, -1):
     if cresult[i] == []:
         del result[i]
 print(result)

但是这段代码没有合并我所有的示例输入(我不能粘贴示例输入,因为它的敏感数据)

这里有一种方法

每对:

  • 如果我们找到一个包含其中一个值的组,我们会将该对附加到该组中
  • 如果我们发现第二个组包含另一个值,我们将合并这些组
  • 如果我们没有找到匹配的组,那么我们的对就构成了一个新的组


我希望下面的代码能够解决您的问题:

import itertools
import copy

lista = [["a","b"],["c","d"],["a", "e"],["f","d"],["x","y"]] #[["a","b"],["e","d1"],["a", "e"],["a","d"],["d","y"]]

def grouped_list(lista):
    aa = []
    bbc = copy.deepcopy(lista)
    flag = False

    for a, b in itertools.combinations(lista,2):
        bb = a+b

        if len(set(bb)) < len(bb):
            flag = True
            cc = list(set(bb))
            cc.sort()

            if cc not in aa: aa.append(cc)
            if a in lista:   lista.remove(a) 
            if b in lista:   lista.remove(b)

    if lista:        aa = aa + lista
    if not flag:     return bbc
    else:            return grouped_list(aa)


print ("Grouped list -->", grouped_list(lista))    
导入itertools
导入副本
清单a=[“a”、“b”]、[“c”、“d”]、[“a”、“e”]、[“f”、“d”]、[“x”、“y”]#[“a”、“b”]、[“e”、“d1”]、[“a”、“e”]、[“a”、“d”]、[“d”、“y”]
def分组列表(列表A):
aa=[]
bbc=copy.deepcopy(lista)
flag=False
对于itertools.组合中的a、b(列表a、2):
bb=a+b
如果len(set(bb))”,分组列表(lista))

请随意询问/建议上述代码中的任何内容。

您的分组“规则”是什么还不清楚。你能进一步解释吗?解释分组的标准,再给出至少一个输入/输出示例,并表明你已经研究了自己的问题。分组规则似乎是合并任何具有共同元素的列表(a和d是示例中导致分组的共同元素,a在第一和第三个列表中,d在第二和第四个列表中)。。分组是一组合并的列表。对此我有一个答案,我理解OP的要求。@b-fg您可以投票重新打开更复杂的数据集,如[1],您需要删除“for lst in tests:”并直接在名为“tests”的列表上运行函数,否则它会给您类似的结果[2]。[1] &[2]最后一个循环在3种不同的情况下运行函数,以验证每个测试情况的输出是否正确。这就是为什么不同的案例被分组在一个名为
tests
的列表中。当然,您需要直接对数据调用函数。
import itertools
import copy

lista = [["a","b"],["c","d"],["a", "e"],["f","d"],["x","y"]] #[["a","b"],["e","d1"],["a", "e"],["a","d"],["d","y"]]

def grouped_list(lista):
    aa = []
    bbc = copy.deepcopy(lista)
    flag = False

    for a, b in itertools.combinations(lista,2):
        bb = a+b

        if len(set(bb)) < len(bb):
            flag = True
            cc = list(set(bb))
            cc.sort()

            if cc not in aa: aa.append(cc)
            if a in lista:   lista.remove(a) 
            if b in lista:   lista.remove(b)

    if lista:        aa = aa + lista
    if not flag:     return bbc
    else:            return grouped_list(aa)


print ("Grouped list -->", grouped_list(lista))