如何将列表划分为给定的时间步长

时间:2016-09-12 16:28:01

标签: python list

我有一个清单,例如

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等。

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]