【发布时间】:2021-12-08 20:45:16
【问题描述】:
我有一个元组列表,每个元组都携带以下信息:
(start_position,end_position,list of strings)
示例列表如下:
aList = [(6, 9, ['ataH']),
(4, 9, ['svataH']),
(0, 9, ['vEvasvataH']),
(2, 5, ['vasu', 'vasU']),
(1, 3, ['Eva', 'eva']),
(0, 1, ['vA', 'vE'])]
我需要找到所有的元组序列,使得每个序列必须覆盖从start_position 到end_position 的所有位置,在本例中是从0 到9。在一个序列中,比如a,相邻的元组需要满足a[i+1][0] - a[i][1] <= 1 的约束。
总结一下,输出应该如下:
[[(0, 1, ['vA', 'vE']), (2,5,['vasu', 'vasU']), (6, 9, ['ataH']) ],
[(0, 1, ['vA', 'vE']), (1, 3, ['Eva', 'eva']), (4, 9, ['svataH'])],
[(0, 9, ['vEvasvataH'], [7])]]
我已经使用以下代码来实现相同的效果。
maxVal = max(aList,key=lambda item:item[1])[1]
diffSets = list()
for i,item in enumerate(aList):
if maxVal == item[1]:
_temp = [item]
currStart = item[0]
for j,stuff in enumerate(aList):
if i != j:
if currStart == stuff[1] or currStart == stuff[1]+1:
_temp.append(stuff)
currStart = stuff[0]
diffSets.append(_temp) #the output needs to be reversed to get the sequence in the order as shown above
有没有更有效和更快的方法来实现同样的目标,比如使用itertools?
【问题讨论】:
-
你需要找到所有可能的集合吗?还是任何组合都可以?
-
所有可能的组合@flakes
-
在这种情况下你会怎么做:
[(0, 6, []), (5, 10, [])]? -
你的意思是
a[i][1] - a[i+1][0] <= 1? -
此处无法进行线性搜索。找到重叠段后,您需要能够回溯。所以基本上,这是图遍历。