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

2024-04-25 20:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想删除排序列表中的每一个项目,当它是在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吗? 有人有更好的方法来写这段代码吗?你知道吗

谢谢 当做 迈克尔


Tags: 项目代码inevent示例列表forif
1条回答
网友
1楼 · 发布于 2024-04-25 20:26:56

这将返回一个包含项的生成器。你知道吗

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]

这假设当你说“在前一个项目的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
网友
2楼 · 发布于 2024-04-25 20:26:56

你可以试试这个。只要检查一下第一个元素和下一个元素的区别

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,则计算差值。将其附加到新的\u列表
  3. 现在perform与新添加的元素get by new_list[-1]相同
网友
3楼 · 发布于 2024-04-25 20:26:56
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]

相关问题 更多 >