📜  Python|将列表与列表列表中的公共元素合并

📅  最后修改于: 2022-05-13 01:55:02.477000             🧑  作者: Mango

Python|将列表与列表列表中的公共元素合并

给定一个列表列表,我们必须合并所有具有共同元素的子列表。这些类型的问题在大学考试和解决编码竞赛时非常常见。
以下是实现这一目标的一些方法。

Input:
[[11, 27, 13], [11, 27, 55], [22, 0, 43], 
 [22, 0, 96], [13, 27, 11], [13, 27, 55], 
 [43, 0, 22], [43, 0, 96], [55, 27, 11]]

Output:
[[0, 43, 96, 22], [27, 11, 13, 55]]

方法#1:使用递归是合并所有具有共同元素的子列表的最粗暴的方法

# Python code to merge all sublist having common elements.
  
# Using recursion to merge all sublist having common elements.
def merge(Input, _start, _c = [], _seen = [], _used=[]):
    elem = [x for x in Input if any(y in _start for y in x) 
    and x not in _seen and x not in _used]
    if not elem:
        yield set(_c)
        for x in Input:
            if x != _start and x not in _used:
                yield from merge(Input, x, _c=[], _seen=[], 
                           _used=_used+[x, *elem])
    else:
        yield from merge(Input, _start, _c = _c + [x for
                                            y in elem for x in y],
                    _seen=_seen + elem, _used = _used + elem)
  
#Input list Initialization
Input = [[11, 27, 13], [11, 27, 55], [22, 0, 43],
         [22, 0, 96], [13, 27, 11], [13, 27, 55],
         [43, 0, 22], [43, 0, 96], [55, 27, 11]]
  
#Calling merge function
Output = list(map(list, {tuple(x) for
                         x in merge(Input, Input[0], _seen=[Input[0]])
                         if x}))
  
#Printing output
print("Initial list of list is :")
print(Input)
print("List of list after merging is:")
print(Output)
Output:
Initial list of list is :
[[11, 27, 13], [11, 27, 55], [22, 0, 43], [22, 0, 96],
 [13, 27, 11], [13, 27, 55], [43, 0, 22], [43, 0, 96],
 [55, 27, 11]]
List of list after merging is:
[[0, 43, 96, 22], [27, 11, 13, 55]]

方法#2:使用连通分量,我们可以将元素建模为连通分量问题并将其建模。

#Python code to merge all sublist having common elements.
  
#Importing 
from collections import defaultdict
  
#merge function to  merge all sublist having common elements.
def merge_common(lists):
    neigh = defaultdict(set)
    visited = set()
    for each in lists:
        for item in each:
            neigh[item].update(each)
    def comp(node, neigh = neigh, visited = visited, vis = visited.add):
        nodes = set([node])
        next_node = nodes.pop
        while nodes:
            node = next_node()
            vis(node)
            nodes |= neigh[node] - visited
            yield node
    for node in neigh:
        if node not in visited:
            yield sorted(comp(node))
  
#Input list initialization
Input = [['z','x','y'], ['y','g','e'], ['z'],['x','p'],
         ['a','b'], ['y','a'], ['d','g']]
  
#Calling merge function
Output = list(merge_common(Input))
  
#Printing function
print("Initial list of list is :")
print(Input)
  
print("List of list after merging is:")
print(Output)
Output:
Initial list of list is :
[['z', 'x', 'y'], ['y', 'g', 'e'], ['z'], ['x', 'p'], ['a', 'b'], ['y', 'a'], ['d', 'g']]
List of list after merging is:
[['a', 'b', 'd', 'e', 'g', 'p', 'x', 'y', 'z']]