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
算法效率更高。我没有投票反对你。@不,这不会改变我只提供同等努力的政策->我不介意帮你弄清楚怎么做,但你必须表现出努力去解决它。