合并起始偏移元组列表(如果前一个元素的偏移量等于下一个元素的起始点)



是否有任何标准库Python或Numpy操作用于执行以下操作:

my_array = [(1, 3), (3, 4), (4, 5), (5, 7), (10, 12), (12, 17), (21, 24)]
new_array = magic_function(my_array)
print(new_array)
> [(1, 7), (10, 17), (21, 24)]

我觉得itertools中的某些东西应该能够做到这一点,似乎是很多人都会使用的东西。我们可以假设列表已经按开始时间排序了。无论如何,这样做并不困难,只需在第一个元素上使用带有键的sorted函数即可。

很抱歉,如果已经问过这个问题,我不知道该如何描述这个问题,但这可以被视为一个开始和偏移的列表,我想合并具有相邻/等效时间的元素。

EDIT:受@chris charley下面的答案的启发,我刚刚编写了一个小函数,它可以实现我想要的功能。

import re
def magic_function(mylist):
# convert list to intspan
intspan = ','.join([f'{int(a)}-{int(b)}' for (a,b) in mylist])
# collapse adjacent ranges
intspan = re.sub(r'-(d+),1', '', intspan)
# convert back to list
return [tuple(map(int, _.split('-'))) for _ in intspan.split(',')]

这里有同样的函数,也适用于浮点:

import re
def magic_function(mylist):
# convert list to floatspan
floatspan = ','.join([f'{float(a)}-{float(b)}' for (a,b) in mylist])
# collapse adjacent ranges
floatspan = re.sub(r'-(d+.?d+?)+,1', '', floatspan)
# convert back to list
return [tuple(map(float, _.split('-'))) for _ in floatspan.split(',')]

intspan使用方法from_ranges()ranges()来生成所需的结果。

>>> from intspan import intspan
>>> my_array = [(1, 3), (3, 4), (4, 5), (5, 7), (10, 12), (12, 17), (21, 24)]
>>> intspan.from_ranges(my_array).ranges()
[(1, 7), (10, 17), (21, 24)]

最新更新