我希望从排序列表中删除每个项目,当它在前一个事件之一的100秒内时。例如:
event_list = [3, 10, 12, 140, 140, 150, 300]
filtered_event_list = [3, 140, 300]
我有以下代码似乎有效。但它不会删除与前一个项目具有相同时间的项目。另一个问题是它不是非常pythonic,因为我需要一个额外的占位符为true / false或0/1来存储我的结果,然后我开始删除100秒内的项目。
downCycles = 100
event_list = [[3, 0], [10, 0], [12, 0], [140, 0], [140, 0], [150, 0], [300, 0]]
for e_idx, event in enumerate(event_list):
if e_idx > 0:
prev_idx = e_idx - 1
while event[0] - event_list[prev_idx][0] < downCycles and prev_idx >= 0:
event[1] = event[0] - event_list[prev_idx][0]
prev_idx -= 1
filtered_event_list = [e for e in event_list if e[1] == 0]
# filtered_event_list = [[3, 0], [140, 0], [140, 0], [300, 0], [800, 0]]
有没有人知道在这个例子中删除第二个140? 有没有人有更好的方法来编写这段代码?
由于 问候 迈克尔
答案 0 :(得分:2)
你可以尝试这个。只是尝试检查第一个元素与下一个元素的区别
event_list = [3, 10, 12, 140, 140, 150, 300]
new_list=[event_list[0]]+
for element in event_list[1:]:
if abs(new_list[-1]-element)>=100:
new_list.append(element)
print new_list
如果你想制作genric方法,请看下面的答案
def elapsed_list(items,time):
new_list=[items[0]]
for element in items[1:]:
if abs(new_list[-1]-element)>=time:
new_list.append(element)
return new_list
print elapsed_list(event_list,10)
#output [3, 140, 150, 300]
print elapsed_list(event_list,100)
#output [3, 140, 300]
print elapsed_list(event_list,200)
#output [3, 300]
解释我是如何实现的
new_list[-1]
答案 1 :(得分:2)
from itertools import tee
downCycles = 100
event_list = [3, 10, 12, 140, 140, 150, 300]
left, right = tee(event_list)
[next(right)] + [i for i in right if i > next(left) + downCycles]
输出:
[3, 140, 300]
答案 2 :(得分:1)
这将返回包含项目的生成器。
def removeCloseItems(items, itemDistance):
if items:
lastOutput = items[0]
yield items[0]
for currentItem in items[1:]:
if ((currentItem - lastOutput) > itemDistance):
lastOutput = currentItem
yield currentItem
样本用法:
In [79]: [x for x in removeCloseItems ([3, 10, 12, 140, 140, 150, 300], 100)]
Out[79]: [3, 140, 300]
这假定当您在之前的某个项目&#34;中说出&#34;在100之内时,表示您之前的输出项目之一。输出应该是什么:
[x for x in removeCloseItems([1, 100, 102], 100)
您想要[1, 102]
还是[1]
?
后者将使用以下代码生成:
def removeCloseItems(items, howFar):
if items:
lastItem = items[0]
yield items[0]
for currentItem in items[1:]:
lastItem = currentItem
if ((currentItem - lastItem) > howFar):
yield currentItem
答案 3 :(得分:0)
一种方法是:
event_list = [3, 10, 12, 140, 140, 150, 300]
filtered_lst = [event_list[0]]
filtered_lst += [j for (i, j) in zip(event_list[:-1], event_list[1:]) if j-i >100]
现在
filtered_lst == [3, 140, 300]