将列表中的元素与其邻居进行比较

时间:2017-07-07 12:27:01

标签: python

我在Python中有29400个值的列表,我试图检查列表中的每个元素是否大于其左边的2000个邻居和右边的2000个邻居。如果元素大于其4000个邻居,我想检索元素的索引。如果右边没有2000个邻居,我只想将它与未来的元素进行比较,直到我到达列表的末尾,反之亦然,如果左边没有2000个值。

def find_peaks(t):
prev = []
future = []
peak_index = []
for i in range(len(t)-2000): # compare element with previous values
    for j in range(1,2001):
        if t[i]<t[i+j]:
            prev.append(False)
            break
        if j==2000:
            if t[i]<t[i+j]:
                prev.append(False)
                break
            prev.append(True)

for i in range(1999,len(t)-1): # compare element with future values
    for j in range(1,2001):
        if t[i]<t[i-j]:
            future.append(False)
            break
        if j==2000:
            if t[i]<t[i-j]:
                future.append(False)
                break
            future.append(True)
future = future[::-1] # reverse list
for i in range(0,len(prev)-1):
    if prev[i] == True:
        if prev[i] == True:
            peak_index.append(i)

有谁知道有什么更好的方法可以解决这个问题?我在比较列表末尾和列表开头附近的元素时遇到了麻烦 - 如果列表中没有剩余的2000个元素供我比较,那么列表会回滚到列表的开头,这不是&# 39;我想要的东西。

3 个答案:

答案 0 :(得分:1)

您可以使用一些列表理解,因此实际搜索变为一行。我无法判断速度和美感,但我的机器只需几秒钟。

{
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": [
        "assets",
        "favicon.ico"
      ],
      "index": "index.html",
      "main": "main.ts",
      "styles": [
        "styles.scss"
      ],
      "scripts": [
        "../node_modules/hammerjs/hammer.min.js"
      ],
      "environmentSource": "environments/environment.ts",
      "environments": {
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts"
      }
    }
  ]
}

答案 1 :(得分:0)

一个天真的,迭代的版本将是遍历每个元素并且看一下后面/前面一定次数以查看是否有大于它的值,如果不认为它是一个选择:

def find_peaks(data, span=2000):
    peaks = []
    for i, value in enumerate(data):
        peak = False  # start with the assumed non-peak
        for j in range(max(0, i - 1), max(0, i - span - 1), -1):  # look behind
            peak = value > data[j]  # check if our value is larger than the selected neighbor
            if not peak:  # not a peak, break away
                break
        if peak:  # look behind passed, look ahead:
            for j in range(i + 1, min(i + span + 1, len(data))):
                if value <= data[j]:  # look ahead failed, break away
                    peak = False
                    break
            if peak:  # if look ahead passed...
                peaks.append(i)  # add it to our peaks list
    return peaks

这是以前瞻/后退方式执行此操作的最佳方式,因为它在不满足条件时立即中断,而不是使用每个元素检查每个元素。

如果您想在计算峰值时计算具有相同值的邻居(因此您当前的候选峰值相同),您可以在后面使用peak = value >= data[j]并在if value < data[j]中使用export abstract class ManagementComponent<T> implements BaseComponent { protected selectedItem: T; protected items: Array<T>; } 前瞻部分。

答案 2 :(得分:0)

我的解决方案不涉及任何语言强大的内置方法。找到目标峰值只是简单的逻辑。基本上我迭代每个元素然后在内部循环中检查它的前一个或后一个邻居是否存在且小于当前元素。我正在将Connection变量初始化为isPeak,以确定两个方向上的邻居都不大于当前元素,这表示当前元素是峰值元素。之后只是得到目标元素的索引。

True

希望它有帮助!