如何合并列表中彼此n之内的元素

我有两个列表:

list_1 = []
list_2 = [1.0,3.0,3.15,1.03,6.0,7.0]

我想对这个列表进行排序,并合并彼此之间(在这种情况下)0.15之内的元素。

因此,到此为止,list_1包含以下值:

[[1.0,1.03],[3.0,3.15]]

因为1.01.03彼此之间在0.15之内,而3.03.15也彼此在0.15之内。

这还可以不仅仅是成对的,例如,如果我有3.16,它在3.15的范围内,那么它将被添加到组中,即:

list_2 = [1.0,7.0,3.16]

输出:

[[1.0,3.16]]

我该怎么做?

感谢您的帮助!

cxd345 回答:如何合并列表中彼此n之内的元素

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

大家都在问