如果合并具有超过50%的共同元素,则迭代设置

时间:2016-12-03 23:52:55

标签: python merge set reduce

我有一个给定两组A和B的函数,它返回一个marged集A.union(B),如果两个集合中的一个与另一个集合共享至少50%的元素,否则为False:

def merged_set_or_false(set1, set2):
  if **magic**:
    return merged_set
  else:
    return False

现在,我想要做的是迭代一个set列表,直到列表中的两个集合不再合并为止。什么是有效的方法呢?在我看来,它看起来像一个reduce()但实际上并没有必然减少到单个元素。

一个例子:

>>> list_of_sets = [(1,2,3,4),(2,3,4,5),(6,7,8,9)]
>>> len(list_of_sets)
3
>>> new_list = merge_until_possible(list_of_sets)
>>> new_list
[(1,2,3,4,5),(6,7,8,9)]
>>> len(new_list)
2

想法?

编辑 - 2016年12月4日 万一有人发现它有用,这是我目前正在进行的解决这个问题的解决方案:

def pseudo_reduce(f, list_to_reduce):
  """Perform f on two elements of list per time until possible."""
  reducing_is_still_possible = True
  exit_loops = False

  while reducing_is_still_possible:
    initial_list_len = len(list_to_reduce)
    for j in range(len(list_to_reduce)):
      # If two elements became one in previous iter, we need to break twice
      if exit_loops:
        exit_loops = False
        break
      # If j is the last element, break to avoid out of index error
      if j == (len(list_to_reduce) - 1):
        break
      for k in range(j + 1, len(list_to_reduce)):
        element_or_false = f(list_to_reduce[j],list_to_reduce[k])
        if element_or_false:
          # We remove the merged elements and append the new one
          del list_to_reduce[k]
          del list_to_reduce[j]
          list_to_reduce.append(element_or_false)
          exit_loops = True
          break

    if len(list_to_reduce) == initial_list_len:
      reducing_is_still_possible = False

 return list_to_reduce

1 个答案:

答案 0 :(得分:0)

我认为将其编写为reduce是不可能的,因为运算符(reduce操作,必须是从两个set列表到一个set列表的函数)不是关联的:" mergeable&#34 ;集合可以由完全不同的集合分隔。如果您已经订购了您的输入(即最常见元素的集合始终相邻),我认为您可以,但这是一项艰难的要求。实际上我认为它不能以任何有效的方式解决,除非这些集合以某种方式排序。