如何计算嵌套列表中局部极大值的个数?

2024-05-12 08:59:56 发布

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

我有一个嵌套的数字列表。就像这个:

[[1,2,3],[3,2,1],[3,1,2],[2,3,1]]

现在,我要计算大于它的前一个元素和前一个元素的数,它的两边必须有一个元素。输出应该是这样的(在列表中):

[0,0,0,1]

输出列表的第一个元素是零,因为在第一个嵌套列表中,它的第一个元素没有其他前一个元素,只有2个在它的前面。对于第二个元素(仍然在第一个嵌套列表中),它有1作为前一个元素,3作为前一个元素,但是输出为零,因为它需要大于前一个元素和前一个元素。第三个元素也是无效的,因为它没有前一个元素,只有前一个元素。除最后一个嵌套列表外,其他嵌套列表也是如此。在上一个嵌套列表中,2和1已经无效,但是3是,所以现在我们需要检查它是否高于它的两个元素。因为3更高,所以最后一个嵌套列表的值是+1。你知道吗

另一个例子:

[[1,2,1,3,1],[2,2,2],[2,3,4,3,4,2,3,1]]

输出应为:

[2,0,3]

输出列表的第一个元素是2,因为在第一个嵌套列表(第一个和最后一个元素已经无效)中,2同时包含这两个元素,并且它也高于这两个元素。然后,我们移到1,它也有两个元素,但它小于这两个元素,所以它是无效的。3是有效的,因为它有两个元素,而且它也更高。所以我们计算+2,因为有2个数字是有效的。第二个嵌套列表无效,因为包含这两个元素的数字不能等于其中任何一个,它需要更高,并且第一个和最后一个元素已经存在无效的.In最后一个嵌套列表,它的第一个和最后一个元素已经无效了,所以我们从它的第二个开始,3,3有两个元素,但它只比前一个元素高,但比前一个元素小。接下来,4有两个元素,它也更高,所以它被计数。下一步,3有两个元素,但它比它们都小,所以不计算。接下来,4同时包含了这两个元素,并且它也高于它的元素。接下来,2有两个元素,但它比它的元素小,所以不计算。接下来,3同时包含这两个元素,并且它也高于这两个元素,所以它也是count。这使得输出列表中的最后一个元素计数为+3。你知道吗

如果解释太长/太长,我很抱歉,但是在python3中有什么方法可以做到这一点吗?你知道吗

编辑:

到目前为止,我已经试过了:

listy = [[1,2,3],[3,2,1],[3,1,2],[2,3,1]]
list_hold = []
for x in listy:
    for y in x:
        if y>y+1 and y>y-1:
            list_hold.append(x)
print(list_hold)

但它只返回一个空列表。你知道吗


Tags: 方法in元素编辑列表forcount数字
2条回答

您需要一个滑动窗口迭代器;从一个输入序列中产生一行3个元素;然后您所要做的就是计算中间元素大于其他两个元素的窗口的数量。你知道吗

滑动窗口问题已经解决了:Rolling or sliding window iterator?,使用^{} function from the top answer there可以得到:

def count_maxima(l):
    # b, the middle value, is larger than both a and c
    return sum(a < b > c for a, b, c in window(l, 3))

result = [count_maxima(sublist) for sublist in outerlist]

演示:

>>> outerlist = [[1,2,3],[3,2,1],[3,1,2],[2,3,1]]
>>> [count_maxima(sublist) for sublist in outerlist]
[0, 0, 0, 1]
>>> outerlist = [[1,2,1,3,1],[2,2,2],[2,3,4,3,4,2,3,1]]
>>> [count_maxima(sublist) for sublist in outerlist]
[2, 0, 3]

我的第一个想法是np.差异。如果有给定的值列表VAL,则可以使用np.差异(VAL)获取一个数组,如果下一个数较小,则该数组为负;如果下一个数较大,则该数组为正

def count_local_maxima(vals):
    if len(vals) < 3:
        return 0
    diffs = np.diff(vals)
    return np.sum((diffs[:-1]>0) & (diffs[1:]<0))

result = [count_local_maxima(sublist) for sublist in mainlist]

相关问题 更多 >