2
counts = misc. array

    for i in counts:
        if i < "(sum of the two integers next to i)/4"
            return -1

我要做的是将列表中小于两个邻居平均值一半的所有值设置为-1。即对于列表 [10., 20., 10., 25., 30.] 如果 i=3 那么我想看看 10 是否小于 (20+25)/4 并且因为那是 45/4 > 10然后我想将 10 设置为 -1。然后,我将过滤列表中的所有值 >= 0。

由于您应该从 i+1 开始,因为此过程不适用于第一个值,然后您应该以 -1 结束,因为此过程不适用于最后一个值,这使情况变得更加复杂。任何帮助将不胜感激。

4

4 回答 4

1

您可以从这个答案中借用滑动窗口生成器,然后像这样使用它:

out = [y if y >= (x+z)/4. else -1 for x,y,z in window(l, 3)]

l你的清单在哪里。

这会切断第一个和最后一个元素。如果您愿意,可以很容易地对它们做一些不同的事情(例如设置为-1)。

于 2013-03-16T19:05:45.770 回答
0

这是否符合您的要求(假设值在 list 中data)?

filtered = [data[i] for i in range(1,len(data)-1) if data[i] >= (data[i+1]+data[i-1])/4]
于 2013-03-16T19:05:46.347 回答
0

像那样:

result = [(x+1 if counts[x] > counts[x-1]/counts[x+1]/4 else -1) for x in range(len(counts[1:-1]))]

-x是计数中的 idex --> for x in range(len(counts[1:-1])
-x+1因为我们知道 counts[0] 和 count[-1] 都已经出局了。因此,为了达到结果,必须对其进行调整
-if count[x] > counts[x-1]/counts[x+1]/4 else -1测试,如果结果为 True,则返回结果,否则 -1
注意> 0,它与您想要的相反
-for x in range(len(counts[1:-1]))
因为我们知道第一个和最后一个值无关紧要
-counts[1:-1]如上所述,总是最好使用列表的副本,线程-安全的

这应该有效,将为您提供每个索引的有效(!=-1)和无效结果列表,(== -1)

问题是,你能对结果做些什么呢?

您可以测试,例如:(注意结果中调整后的 x

 ['N/A'] + [(x if x!= -1 else False) for x in result] + ['N/A']

它为您提供了具有 False 或 True 结果的计数的镜像

于 2013-03-16T19:16:43.270 回答
0

我有一个看起来不太优雅的解决方案,但我相信它是正确且可以理解的。包含过滤,因此如果 -1 是允许的值,它也将起作用。

我使用 3 个变量(a、b 和 i)和 3 个标志变量(fa、fb 和 fi)来显示值是否需要包含在结果集中。

def test(lst):
    a, fa, b, fb, res  = None, False, None, False, []
    for i in lst:
        if a is not None:
            fi = b < (a + i)/4
        else:
            fi = True
        if fa:
            res.append(a)
        a, fa = b, fb
        b, fb = i, fi
    if fa:
        res.append(a)
    res.append(b)
    return res

print(test([10., 20., 10., 25., 30.]))
=> [10.0, 20.0, 25.0, 30.0]
于 2013-03-16T19:41:55.757 回答