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