Python 将集合与公共元素合并?

Python 将集合与公共元素合并?,python,set,Python,Set,我想将集合与公共元素合并。比如说 input = set([frozenset([1,2,3,4]), frozenset([3,4,5,6,7,8]), frozenset([1,1000]), frozenset([100, 200]), frozenset([100, 300, 400])]) 结果: set([frozenset([1,2,3,4,5,6,7,8, 1000]), frozenset([100,200,300,400])]) 实现这一点的有

我想将集合与公共元素合并。比如说

input = set([frozenset([1,2,3,4]), frozenset([3,4,5,6,7,8]),  frozenset([1,1000]),
             frozenset([100, 200]), frozenset([100, 300, 400])])
结果:

set([frozenset([1,2,3,4,5,6,7,8, 1000]), frozenset([100,200,300,400])])
实现这一点的有效方法是什么?

使用内置->仅包含长度大于0的结果



这个答案从高层次上解释了如何实现您想要的。如果你想要一个具体的解决方案,你必须首先展示你解决问题的努力

以下是我试过的。首先,我做了一些简单但错误的事情

result = set()
while input:                                                                   
    r = set(input.pop())
    for rr in input.copy():
        if rr & r:                                                  
            input.remove(rr)
            r.update(rr)  
    result.add(frozenset(r))   
此代码的问题在于,根据
input.pop()
的顺序,合并可能无法完成。假设
input={frozenset([0,1])、frozenset([2,3])、frozenset([1,2])}
并且这三个元素按此赋值顺序弹出并循环,然后
results={frozenset([0,1,2])、frozenset([2,3])

然后我实现了答案。它首先构建一个新图形的邻接列表,每个节点对应于
输入
的一个
冻结集
元素。如果两个节点(
frozenset
s)共享公共元素,则它们之间存在一条边。然后,使用深度优先图遍历来查找新图的连通分量

result, visited = set(), set()
components = collections.defaultdict(list)
adj_list = collections.defaultdict(list)

def dft(node, key):
    visited.add(node)
    components[key].append(node)
    for neighbor in adj_list[node]:
        if neighbor not in visited:
            dft(neighbor, key)

for r1, r2 in itertools.combinations_with_replacement(input, 2):
    if r1 & r2:
        adj_list[r1].append(r2)
        adj_list[r2].append(r1)
for node in adj_list:
    if node not in visited:
        dft(node, node)

for node, neighbors in components.iteritems():
    result.add(node.union(*neighbors))

@AustinHastings使用sets,此操作更快更容易。我已经发布了一个正确的策略。@TemporalWolf该解决方案涉及集合,对于列表、元组等也是如此。您想将一组集合合并在一起吗?构建集。连接组件方法比暴力强制所有对
set.union
/
set.intersection
算法效率更高。我没有投票反对你。@不,这不会改变我只提供同等努力的政策->我不介意帮你弄清楚怎么做,但你必须表现出努力去解决它。