我想测试列表是否包含连续整数。但如果下一个元素是重复的,它会显示出避免它
例如
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()