【发布时间】:2020-10-25 06:46:29
【问题描述】:
我有一个包含表示数字范围的元组的列表。我的目标是返回这个集合的所有(参见下面的注释;真正寻找最长的)可能的子集,这些子集仅与每个元组中的第二个值重叠或根本不重叠。我一直在使用的函数是递归解决这个问题的。
def get_all_end_overlapping_indices(lst, i, out):
all_possibilities = []
def _get_all_end_overlapping_indices_helper(list_in, i, out):
r = -1
if i == len(list_in):
if out:
if len(all_possibilities) == 0:
all_possibilities.append(out)
else:
all_possibilities.append(out)
return
n = i + 1
while n < len(list_in) and r > list_in[n][0]:
n += 1
_get_all_end_overlapping_indices_helper(list_in, n, out)
r = list_in[i][1]
n = i + 1
while n < len(list_in) and r > list_in[n][0]:
n += 1
_get_all_end_overlapping_indices_helper(list_in, n, out + [list_in[i]])
_get_all_end_overlapping_indices_helper.count = 0
lst.sort()
_get_all_end_overlapping_indices_helper(list_in = lst, i = 0, out = [])
return all_possibilities
lst = [(0.0, 2.0), (0.0, 4.0), (2.5, 4.5), (2.0, 5.75), (2.0, 4.0), (6.0, 7.25), (4.0, 5.5)] 得到以下结果
[(6.0, 7.25)]
[(4.0, 5.5)]
[(4.0, 5.5), (6.0, 7.25)]
[(2.5, 4.5)]
[(2.5, 4.5), (6.0, 7.25)]
[(2.0, 5.75)]
[(2.0, 5.75), (6.0, 7.25)]
[(2.0, 4.0)]
[(2.0, 4.0), (6.0, 7.25)]
[(2.0, 4.0), (4.0, 5.5)]
[(2.0, 4.0), (4.0, 5.5), (6.0, 7.25)]
[(0.0, 4.0)]
[(0.0, 4.0), (6.0, 7.25)]
[(0.0, 4.0), (4.0, 5.5)]
[(0.0, 4.0), (4.0, 5.5), (6.0, 7.25)]
[(0.0, 2.0)]
[(0.0, 2.0), (6.0, 7.25)]
[(0.0, 2.0), (4.0, 5.5)]
[(0.0, 2.0), (4.0, 5.5), (6.0, 7.25)]
[(0.0, 2.0), (2.5, 4.5)]
[(0.0, 2.0), (2.5, 4.5), (6.0, 7.25)]
[(0.0, 2.0), (2.0, 5.75)]
[(0.0, 2.0), (2.0, 5.75), (6.0, 7.25)]
[(0.0, 2.0), (2.0, 4.0)]
[(0.0, 2.0), (2.0, 4.0), (6.0, 7.25)]
[(0.0, 2.0), (2.0, 4.0), (4.0, 5.5)]
[(0.0, 2.0), (2.0, 4.0), (4.0, 5.5), (6.0, 7.25)]
由于我最终将处理更大的元组集合(而且运行速度很慢),我想实现一个迭代解决方案;不幸的是,我很难过。这个 sn-p 最初来自:Find all possible combinations that overlap by end and start。虽然它可以工作,但我发现理解它是如何工作的 很棘手。任何人都可以提供一些关于如何构建此问题的迭代解决方案的提示吗?
注意:我实际上只希望获得最长的输出(见下文)。我总是可以稍后过滤掉较短的(即位于最长的内部的那些),但如果它更容易,我很乐意将它们删除。
[(0.0, 2.0), (4.0, 5.5), (6.0, 7.25)]
[(0.0, 2.0), (2.5, 4.5), (6.0, 7.25)]
[(0.0, 2.0), (2.0, 5.75), (6.0, 7.25)]
[(0.0, 2.0), (2.0, 4.0), (4.0, 5.5), (6.0, 7.25)]
[(0.0, 4.0), (4.0, 5.5), (6.0, 7.25)]
【问题讨论】:
标签: python list loops recursion iteration