我有一个清单,例如
event = [0.1, 0.6, 1.5, 3.4, 3.8, 4.1, 6.2, 8.5, 9.1, 9.5]
列表中的每个项目都是在时间0.1,时间0.6等发生的事件。
我想将列表分成delta t,但是怎么做呢?我所看到的所有其他线程只讨论了将列表拆分为相等的部分,但在这种情况下,如果我们有delta t = 1,我想要一个列表,其中0.1和0.6在一起,另一个用于1.5等。
答案 0 :(得分:1)
您可以非常轻松地使用itertools.groupby
执行此操作:
from itertools import groupby
event.sort()
delta_t = 1
r = [list(v) for (k, v) in groupby(event, lambda v: v // delta_t)]
答案 1 :(得分:1)
另一种可能的解决方案:
from collections import defaultdict
def split_list(lst, delta=1):
start, end = 0, max(event)
result = []
while start < end:
start += delta
group = filter(lambda x: x > (start - delta) and x < start, event)
if group:
result.append(group)
return result
event = [0.1, 0.6, 1.5, 3.4, 3.8, 4.1, 6.2, 8.5, 9.1, 9.5]
print split_list(event)
# [[0.1, 0.6], [1.5], [3.4, 3.8], [4.1], [6.2], [8.5], [9.1, 9.5]]
答案 2 :(得分:0)
这是一个只在列表中迭代一次的版本:
start = 0
delta = 1
stop = delta
grouped = []
group = []
event = [0.1, 0.6, 1.5, 3.4, 3.8, 4.1, 6.2, 8.5, 9.1, 9.5]
for val in event:
if start < val < stop:
group.append(val)
else:
while val > stop:
start += delta
stop += delta
grouped.append(group)
group = [val]
print(grouped) # [[0.1, 0.6], [1.5], [3.4, 3.8], [4.1], [6.2], [8.5]]
答案 3 :(得分:0)
首先,确保列表已排序。完成此操作后,请遍历列表。从第一个值开始,创建一个新列表,其中包含从第一个值到最终值的所有值,这些值位于所需范围内。然后,跳转到该值的索引并重复。给定delta t为1,列表
event = [0.1, 0.6, 1.5, 3.4, 3.8, 4.1, 6.2, 8.5, 9.1, 9.5]
将[0.1,0.6]连接到第一步的较小列表,并在[1.5]处开始第二步,因为1.5是范围之外的第一个值1.重复此过程直到你拥有所有较小的值列出你需要的。
答案 4 :(得分:0)
看起来你只想要一个列表,它们由上面/下面的整数分隔。如果是这种情况,那么只需在条件...循环中使用“delta”,通过列表将每个值与delta进行比较,并记录您要插入的“当前/活动”列表的索引。如果当前值小于delta插入它。 假设初始列表已排序......
import math
list_of_lists=[[]]
active_index=0
for entry in event:
if entry<delta #use current delta and an outer loop if they are preset or increment delta by your step-size on each loop
list_of_lists[active_index].append(entry)
else:
list_of_lists.append([])
active_index+=1
list_of_lists[active_index].append(entry)
#seems like you want to go to the next highest int here:
delta=math.ceil[entry]