networkx
在这里过大。只需先对列表进行排序,然后在上一个和当前之间的差异大于您的增量时进行迭代并产生一个块。
>>> list_2 = [1.0,3.0,3.15,1.03,6.0,7.0,3.16]
>>> list_2.sort()
>>> delta = 0.15
>>> list_1 = []
>>> prev = -float('inf')
>>> for x in list_2:
... if x - prev > delta:
... list_1.append([x])
... else:
... list_1[-1].append(x)
... prev = x
...
>>> list_1
[[1.0,1.03],[3.0,3.16],[6.0],[7.0]]
>>> [x for x in list_1 if len(x) > 1]
[[1.0,3.16]]
,
要在给定大小的间隙上拆分列表,可以使用zip来比较元素与其相邻元素,从而给出序列中中断的位置。然后再次压缩以将这些中断位置转换为原始数据的范围。
data = [1,2,5,6,7,9,22,24,26,29]
gap = 2
breaks = [ i for i,(a,b) in enumerate(zip(data,data[1:]),1) if abs(a-b) > gap ]
result = [ data[s:e] for s,e in zip([0]+breaks,breaks+[len(data)]) ]
print(result)
[[1,2],[5,9],[22,26],[29]]
请注意,这也适用于未排序的列表
该技术可以概括为一个函数,该函数将在任何给定条件下拆分任何列表:
def splitList(A,condition):
breaks = [i for i,b) in enumerate(zip(A,A[1:]),1) if condition(a,b)]
return [A[s:e] for s,breaks+[len(A)])]
data = [1,29]
gap=2
result = splitList(data,lambda a,b: abs(a-b)>gap)
print(result)
[[1,[29]]
data = [1,4,10,15,14,12]
ascend = splitList(data,b: a>b) # split ascending streaks
print(ascend)
[[1,6],[4],[2,15],[14],[7,12]]
本文链接:https://www.f2er.com/3155101.html