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

时间:2018-04-19 06:42:20

标签: python python-3.x

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

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

现在,我想计算比它的前一个元素及其前面的元素更大的数字,它还必须在它的两个元素上都有一个元素。两侧。输出应该是这样的(在列表中):

[0,0,0,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,因为有2个数字有效。第二个嵌套列表无效,因为包含两个元素的数字不能等于它们中的任何一个,它需要更高,并且第一个和最后一个元素已经无效。在最后一个嵌套列表中,它的第一个和最后一个元素已经无效了,所以我们从它的第二个开始,3,3有两个元素,但它只比它的前一个元素高,但比它的前一个要小。接下来,4有两个元素,它也更高,所以它被计算。接下来,3有两个元素,但它比它们都小,所以不计算。接下来,4具有两个元素,并且它也高于它的元素。接下来,2有两个元素,但它比它的元素小,所以它不计算。接下来,3有两个元素,它也高于两者,所以它也算数。这使得输出列表中的最后一个元素计数为+3。

如果解释太长/太长,我很抱歉,但有没有办法在Python 3中这样做?

编辑:

到目前为止,我已经尝试过这个:

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)

但它只返回一个空列表。

2 个答案:

答案 0 :(得分:1)

你需要一个滑动窗口迭代器;从输入序列连续产生3个元素的东西;所有你需要做的就是计算中间元素大于其他两个元素的窗口数。

滑动窗口问题已经解决:Rolling or sliding window iterator?,使用window() function from the top answer there会给你:

>>> 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]

演示:

@app.route('/inner', methods=['GET', 'POST'])
    def inner():
        name = request.form['name']
        password = request.form['password']
        if name == "" or password == "":
            return render_template('index.html');
        else:
            df = pd.read_csv("login.csv", sep=',', encoding="utf-8")
            for row in df:
                if row[0][0] == name and row[0][1] == password:
                    print('sucess')
                    return render_template('inner.html');
                else:
                    return render_template('index.html');

答案 1 :(得分:0)

我的第一个想法是使用np.diff。如果你有一个给定的值列表,你可以使用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]