数组递增的判断【python实现】

有时候需要对某一组数组的数据进行判断是否 递增 的场景,比如我在开发一些体育动作场景下,某些肢体动作是需要持续朝着垂直方向向上变化,那么z轴的值是会累增的。同理,逆向考虑,递减就是它的对立面。

下面是查找总结到的所有方式,如有补充可以评论区提出。

资料参考来源: Check if list is strictly increasing

1. zip() and all()

  • Code:
test_list = [1, 4, 5, 7, 8, 10]
# Using zip() and all() to
# Check for strictly increasing list
res = all(i < j for i, j in zip(test_list, test_list[1:]))
print(f"Is list strictly increasing ? : {res}")
  • Output:
Is list strictly increasing ? : True

时间复杂度: O(n), n是数组的长度。

2. reduce and lambda

  • Code:
import functools

test_list = [1, 4, 5, 7, 8, 10]
res = bool((lambda list_demo: functools.reduce(lambda i, j: j if
                                    i < j else 9999, list_demo) != 9999)(test_list))

print(f"Is list strictly increasing ? : {res}")
  • Output:
Is list strictly increasing ? : True

时间复杂度: O(n), n是数组的长度。

3. itertools.starmap() + zip() + all()

  • Code:
import itertools

test_list = [1, 4, 5, 7, 8, 10]
res = all(itertools.starmap(operator.le, zip(test_list, test_list[1:])))

print(f"Is list strictly increasing ? : {res}")
  • Output:
Is list strictly increasing ? : True

时间复杂度: O(n), n是数组的长度。

4. sort() and extend()

  • Code:
test_list = [1, 4, 5, 7, 8, 10]
res = False
new_list = []
new_list.extend(test_list)
test_list.sort()

if new_list == test_list:
    res = True

print(f"Is list strictly increasing ? : {res}")
  • Output:
Is list strictly increasing ? : True

时间复杂度: O(nlogn), 这里是sort()的时间复杂度

5. Use stacks

栈是一种后进先出的数据结构(Last in, first out)。

  • Code:
def is_strictly_increasing(lst):
    stack = []
    for i in lst:
        if stack and i <= stack[-1]:
            return False
        stack.append(i)
    return True

test_list = [1, 4, 5, 7, 8, 10]
print(is_strictly_increasing(test_list))  # True
 
test_list = [1, 4, 5, 7, 7, 10]
print(is_strictly_increasing(test_list))  # False

时间复杂度: O(n),原数组被遍历了一遍
空间复杂度: O(n),栈可能要存储全部的n个原数组元素

6. numpy()

  • Code:
import numpy as np


def is_increasing(lst):
    # Converting input list to a numpy array
    arr = np.array(lst)

    # calculate the difference between adjacent elements of the array
    diff = np.diff(arr)

    # check if all differences are positive
    # using the np.all() function
    is_increasing = np.all(diff > 0)

    # return the result
    return is_increasing


# Input list
test_list = [1, 4, 5, 7, 8, 10]

# Printing original lists
print("Original list : " + str(test_list))

result = is_increasing(test_list)

print(result)
# True

时间复杂度: O(n)

7. itertools.pairwise() and all()

这里面就等于使用 pairwise() 替代了之前的 zip(list, list[1:])

  • Code:
from itertools import pairwise


# Function
def is_strictly_increasing(my_list):
    # using pairwise method to iterate through the list and
    # create pairs of adjacent elements.

    # all() method checks if all pairs of adjacent elements
    # satisfy the condition i < j, where i and j
    # are the two elements in the pair.
    if all(a < b for a, b in pairwise(my_list)):
        return True
    else:
        return False


# Initializing list
test_list = [1, 4, 5, 7, 8, 10]

# Printing original lists
print("Original list : " + str(test_list))

# Checking for strictly increasing list
# using itertools pairwise() and all() method
res = is_strictly_increasing(test_list)

# Printing the result
print("Is list strictly increasing ? : " + str(res))
  • Output:
Original list : [1, 4, 5, 7, 8, 10]
Is list strictly increasing ? : True

时间复杂度: O(n)

posted @ 2023-05-23 14:58  丹华抱一鷇音子  阅读(220)  评论(0编辑  收藏  举报