Python 如何制作分区结构
让我们从存储在列表中的段[0,10]开始Python 如何制作分区结构,python,algorithm,numpy,Python,Algorithm,Numpy,让我们从存储在列表中的段[0,10]开始 [ [0, 10] ] 我收到了一套射程 [1,6] [5, 8] 将段划分到列表中 [ [0,1], [1,5], [5,6], [6, 8], [8, 10] ] 在python中,什么样的数据结构/方法可以很好地做到这一点 我不知道这类任务的术语,所以我的谷歌搜索没有结果 我总是可以用numpy.searchsorted暴力,但这不会是干净的。 尤其是每个子段实际上是一个具有许多属性的对象。 而且,我有几轮 creating sub-s
[ [0, 10] ]
我收到了一套射程
[1,6]
[5, 8]
将段划分到列表中
[ [0,1], [1,5], [5,6], [6, 8], [8, 10] ]
在python中,什么样的数据结构/方法可以很好地做到这一点
我不知道这类任务的术语,所以我的谷歌搜索没有结果
我总是可以用numpy.searchsorted
暴力,但这不会是干净的。尤其是每个子段实际上是一个具有许多属性的对象。
而且,我有几轮
creating sub-segment object / receiving ranges for further partitioning
在我看来,这就像是一个排序问题。将初始范围插入数组,然后再插入所有其他值。对数组进行排序,然后将其成对拆分,这将为您提供子范围。您还可以使用第一个范围设置最小/最大值进行验证 我不确定您希望如何查询数据结构,或者每个段都有哪些“属性”,但给出您的示例,一个排序集数据结构就足够了。如果我们将您的列表展平,则我们有:
initial = [0, 10]
...
final = [0, 1, 5, 6, 8, 10]
我们可以通过以下方式将final转化为您的细分市场:
segments = [final[pos:pos+1] for pos in xrange(len(final) - 1)]
因此,对于每一个附加部分,我们将其与以下内容结合起来:
next_iter = sorted(set(prev_iter + segment))
对于大型列表来说,这将变得昂贵,但有一些数据类型可以提供帮助。排序集容器按排序顺序将其元素作为一个集合进行维护。模块提供的数据类型正好用于此目的:
from sortedcontainers import SortedSet
segments = SortedSet([0, 10])
def add_segment(start, end):
segments.add(start)
segments.add(end)
add_segment(1, 6)
add_segment(5, 8)
print segments
# SortedSet([0, 1, 5, 6, 8, 10])
SortedSet支持快速索引和对分,因此您可以像这样进行查询:
print segments[2]
# 5
pos = segments.bisect(7)
print [segments[pos - 1], segments[pos]]
# [6, 8]
你可能有一个输入错误,在[5,6]之后你有[5,8]而不是[6,8]@Kicsi谢谢,修正了。