联合列表中所有相交集的pythonic方法是什么?

时间:2012-03-14 19:57:49

标签: python set

我有一个集合列表,

[set([0, 1, 2]),
 set([3, 2]),
 set([4, 1]),
 set([5, 6]),
 set([7, 8])]

我需要联合所有相交的东西,以便得到以下结果:

[set([0, 1, 2, 3, 4]),
 set([5, 6]),
 set([7, 8])]

最优雅的方法是什么?我想不出比n * n循环更好的东西。

2 个答案:

答案 0 :(得分:4)

这将产生您描述的输出。它应该比n * n运行得更好,除非你没有交叉点,否则应该让一些人受益。

mysets = [set([0, 1, 2]),
          set([3, 2]),
          set([4, 1]),
          set([5, 6]),
          set([7, 8])]

# Require at least one set in the output.
output = [mysets.pop(0)]

while mysets:
  test = mysets.pop(0)
  for idx, other in enumerate(output):
    if test & other:
      output[idx] |= test
      break
  else:
    output.append(test)

# output -> [set([0, 1, 2, 3, 4]), set([5, 6]), set([8, 7])]

答案 1 :(得分:1)

我会做这样的事情:

sets = [set([0, 1, 2]),
        set([3, 2]),
        set([4, 1]),
        set([5, 6]),
        set([7, 8])]

intersections = [sets[0]]
for start_set in sets[1:]:
    intersects = False
    for final_set in intersections:
        if len(final_set & start_set) > 0:
            final_set.update(start_set)
            intersects = True
    if not intersects:
        intersections.append(start_set)

在最好的情况下它应该是O(n)(所有集合相交)但在最坏的情况下将是O(n * n)(没有集合相交)。