Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算嵌套列表中局部极大值的数量?_Python_Python 3.x - Fatal编程技术网

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

Python 如何计算嵌套列表中局部极大值的数量?,python,python-3.x,Python,Python 3.x,我有一个嵌套的数字列表。像这个: [[1,2,3],[3,2,1],[3,1,2],[2,3,1]] 现在,我想计算一个比前一个元素和前一个元素大的数,它的两边必须都有一个元素。输出应如下所示(在列表中): 输出列表的第一个元素为零,因为在第一个嵌套列表中,它的第一个元素没有其他前一个元素,但在它的前面只有2个。对于第二个元素(仍然在第一个嵌套列表中),它有1作为它的前一个元素,3作为它的前一个元素,但输出为零,因为它需要大于它的前一个元素和它的前一个元素。第三个元素也是无效的,因为它没有前一

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

[[1,2,3],[3,2,1],[3,1,2],[2,3,1]]
现在,我想计算一个比前一个元素和前一个元素大的数,它的两边必须都有一个元素。输出应如下所示(在列表中):

输出列表的第一个元素为零,因为在第一个嵌套列表中,它的第一个元素没有其他前一个元素,但在它的前面只有2个。对于第二个元素(仍然在第一个嵌套列表中),它有1作为它的前一个元素,3作为它的前一个元素,但输出为零,因为它需要大于它的前一个元素和它的前一个元素。第三个元素也是无效的,因为它没有前一个元素,只有前一个元素。除最后一个嵌套列表外,其他嵌套列表也是如此。在上一个嵌套列表中,2和1已经无效,但是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,因为有两个数字是有效的。第二个嵌套列表无效,因为包含两个元素的数字不能等于其中任何一个,它需要更高,并且第一个和最后一个元素已经无效。在最后一个嵌套列表中,它的第一个和最后一个元素已经无效,所以我们从它的第二个开始,3,3有两个元素,但它只比前一个元素高,但比前一个元素小。接下来,4有两个元素,并且它也更高,所以它被计数。接下来,3有两个元素,但它比这两个元素都小,所以不计算。其次,4有两个元素,并且它也高于它的元素。其次,2有两个元素,但它比它的元素小,所以不计算。接下来,3有两个元素,并且它也比这两个元素都高,所以它也是计数。这使得输出列表中的最后一个元素计数为+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)
但是它只返回一个空列表。

您需要一个滑动窗口迭代器;从输入序列中产生一行3个元素的东西;然后只需计算中间元素大于其他两个元素的窗口数

滑动窗口问题已解决:,使用将为您提供:

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]

我的第一个想法是使用np.diff。如果您有一个给定的值列表vals,那么可以使用np.diff(vals)获得一个数组,该数组在下一个数字较小时为负值,在下一个数字较大时为正值

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]
def计数\本地\最大值(VAL):
如果len(VAL)<3:
返回0
差值=np.差值(VAL)

返回np.sum((diffs[:-1]>0)和(diffs[1:]基本上认为您希望以数字的形式找到局部最大值的数量。您是否分享了您的尝试?提示:您正在谈论前面和后面的元素(前面的元素可以工作,但前面的方向不适用于此处)。这可能会对您有所帮助:我已对其进行了编辑。您的代码显示:name错误:名称“窗口”不可用defined@mahir您确实需要添加链接文章中的函数。
>>> 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]
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]