Python列表查看是否包含连续的数字,但避免相邻/下一个重复



我想测试列表是否包含连续整数。但如果下一个元素是重复的,它会显示出避免它

例如

raw_list_1 = [400, 401, 402] # this is valid
raw_list_2 = [400, 401, 403] # this is in-valid
raw_list_3 = [400, 401, 401, 401, 402, 403] # this is valid

rawlist3的情况下,我们得到了数字可以按顺序重复的模式。

我的代码

raw_list_1 = [400, 401, 402] # this is valid
raw_list_2 = [400, 401, 403] # this is in-valid
raw_list_3 = [400, 401, 401, 401, 402, 403] # this is valid
is_valid_list = sorted(raw_list_3) == list(range(min(raw_list_3), max(raw_list_3)+1))
print(is_valid_list)
False
#################

方法的优化是只检查第一个元素和最后一个元素之间的差异,而不是实际生成列表:

sorted_uniques = sorted(set(raw_list))
is_valid_list = sorted_uniques[-1] - sorted_uniques[0] == len(sorted_uniques) - 1

如果不使用排序技巧,可以检查连续元素之间的差异:

is_valid_list = all(0 <= y - x <= 1 for x, y in zip(raw_list, raw_list[1:]))

如果一阶导数始终在{0, 1}中,则列表有效。

import numpy as np
def is_valid(arr_like):
return np.isin(np.diff(arr_like), [0,1]).all()
is_valid(raw_list_1), is_valid(raw_list_2), is_valid(raw_list_3)
#OUTPUT:
#(True, False, True)

如果你确定你的所有列表都是单调的,而不是递减的,你可以通过以下方式优化函数:

def is_valid(arr_like):
return (np.diff(arr_like)<=1).all()

最新更新