Python two or more duplicate list in a list element Synthesis

In Python, this list data structure is used to, if two or more of the same list structure, the same content type, we usually use two or more combined into a list, so that we can be recycled when a traverse property disposed of. So how will merge into two or more list next one is what we want to say.

Example Effect:

[[1,2], [3,4,5], [0,4]] becomes [[1,2], [0,3,4,5]

[[1], [1,2], [0,2]] becomes [[0,1,2]]

[[1, 2], [2, 3], [3, 4]] becomes [[1,2,3,4]]

1, itertools achieve

from itertools import combinations

def bfs(graph, start):
    visited, queue = set(), [start]
    while queue:
        vertex = queue.pop(0)
        if vertex not in visited:
            visited.add(vertex)
            queue.extend(graph[vertex] - visited)
    return visited

def connected_components(G):
    seen = set()
    for v in G:
        if v not in seen:
            c = set(bfs(G, v))
            yield c
            seen.update(c)

def graph(edge_list):
    result = {}
    for source, target in edge_list:
        result.setdefault(source, set()).add(target)
        result.setdefault(target, set()).add(source)
    return result

def concat(l):
    edges = []
    s = list(map(set, l))
    for i, j in combinations(range(len(s)), r=2):
        if s[i].intersection(s[j]):
            edges.append((i, j))
    G = graph(edges)
    result = []
    unassigned = list(range(len(s)))
    for component in connected_components(G):
        union = set().union(*(s[i] for i in component))
        result.append(sorted(union))
        unassigned = [i for i in unassigned if i not in component]
    result.extend(map(sorted, (s[i] for i in unassigned)))
    return result

print(concat([[1, 2], [3, 4, 5], [0, 4]]))
print(concat([[1], [1, 2], [0, 2]]))
print(concat([[1, 2], [2, 3], [3, 4]]))

Output:
[[0, 3, 4, 5], [1, 2]]
[[0, 1, 2]]
[[1, 2, 3, 4]]

Python two or more duplicate list in a list element Synthesis

2, iterative method to achieve

original_list = [[1,2],[3,4,5],[0,4]]
mapping = {}
rev_mapping = {}
for i, candidate in enumerate(original_list):
    sentinel = -1
    for item in candidate:
        if mapping.get(item, -1) != -1:
            merge_pos = mapping[item]
            #update previous list with all new candidates
            for item in candidate:
                mapping[item] = merge_pos
            rev_mapping[merge_pos].extend(candidate)
            break
    else:
        for item in candidate:
            mapping[item] = i
        rev_mapping.setdefault(i, []).extend(candidate)
result = [list(set(item)) for item in rev_mapping.values()]
print(result)

Output:
[[1, 2], [0, 3, 4, 5]]

Python two or more duplicate list in a list element Synthesis

Guess you like

Origin www.linuxidc.com/Linux/2020-02/162381.htm