• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Python:在迭代时将范围添加到范围列表

python 来源:K Mdy 3次浏览

我遇到问题并希望任何人都可以给我一个小技巧来克服它。Python:在迭代时将范围添加到范围列表

我有一个2D-python-list(83行和3列)。前两列是间隔的开始和结束位置。第三列是数字索引(例如:9.68)。该列表按第3列进行反向排序。 我想要得到所有与最高索引不重叠的区间。

这里是排序列表的示例:

504 789 9.68 
503 784 9.14 
505 791 8.78 
499 798 8.73 
1024 1257 7.52 
1027 1305 7.33 
507 847 5.86 

这里是我的尝试:

# Define a function that test if 2 intervals overlap 
def overlap(start1, end1, start2, end2): 
     return not (end1 < start2 or end2 < start1) 

best_list = [] # Create a list that will store the best intervals 
best_list.append([sort[0][0],sort[0][1]]) # Append the first interval of the sorted list 
# Loop through the sorted list 
for line in sort: 
    local_start, local_end = line.rsplit("\s",1)[0].split() 
    for i in range(len(best_list)): 
     best_start = best_list[i][0] 
     best_end = best_list[i][1] 
     test = overlap(int(best_start), int(best_end), int(local_start), int(local_end)) 
     if test is False: 
      best_list.append([local_start, local_end]) 

我也得到:

best_list = [(504, 789),(1024, 1257),(1027, 1305)] 

但我想:

best_list = [(504, 789),(1024, 1257)] 

谢谢!


===========解决方案如下:

嗯,我有一些关于你的代码的问题。由于sort包含字符串,因此该行append([sort[0][0],sort[0][1]])做了什么你期望的?

无论如何,你的问题主要是当你的列表中存在多个元素时,只要其中一个通过重叠测试就可以被添加到列表中(不是你想要的)。例如。当两个(504, 789),(1024, 1257)都存在时,(1027, 1305)将被插入到列表中,因为它与(504, 789)进行比较时通过了测试。

于是,我做了一些改变,现在它似乎按预期方式工作:

best_list = [] # Create a list that will store the best intervals 
best_list.append(sort[0].rsplit(" ", 1)[0].split()) # Append the first interval of the sorted list 
# Loop through the sorted list 
for line in sort: 
    local_start, local_end = line.rsplit("\s", 1)[0].split() 
    flag = False # <- flag to check the overall overlapping 
    for i in range(len(best_list)): 
     best_start = best_list[i][0] 
     best_end = best_list[i][1] 
     test = overlap(int(best_start), int(best_end), int(local_start), int(local_end)) 
     print(test) 
     if test: 
      flag = False 
      break 
     flag = True 
    if flag: 
     best_list.append([local_start, local_end]) 

主要思想是检查每一个元素,如果通过了所有重叠的测试,那么添加它(的最后一行我的代码)。之前没有。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)