如果项目在给定范围内,则从列表中删除项目

时间:2014-07-17 07:22:50

标签: python list python-2.7 optimization

我希望从排序列表中删除每个项目,当它在前一个事件之一的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? 有没有人有更好的方法来编写这段代码?

由于 问候 迈克尔

4 个答案:

答案 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]

解释我是如何实现的

  1. 我们需要在第一个和下一个元素之间采取差异的逻辑
  2. 所以我拿了另一个列表,它接受第一个元素并计算差异,如果差异大于100.将它附加到new_list
  3. 现在与新添加的元素get new_list[-1]
  4. 相同

答案 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]