我正在尝试编写一个函数来确定列表中的数字是否按连续顺序排列。我的第一个想法是看看我是否可以让程序检查一个数字与它之前的数字之间的差异是否始终等于 1(例如位置 x - (x-1) == 1),但还没有找到方法将 x 定义为任何给定位置,仅限特定位置。
这是我迄今为止的尝试:
def is_consecutive(a_list):
if a_list[x] - a_list[x-1] == 1:
print("The list is consecutive.")
else:
print("The list is not consecutive.")
is_consecutive([1,2,3,4,5])
有没有办法定义 x 以便它引用列表中的任何和所有位置而不输入特定的位置编号?
或者我想得太多了,有一个更简单的解决方案吗?
您缺少获取每个元素的迭代器部分。无需修改太多代码:
def is_consecutive(a_list):
for x in range(1, len(a_list): # iterate through each element of the list (starting at the second, index = 1)
if a_list[x] - a_list[x-1] != 1: # evaluate your condition
print("The list is not consecutive.")
return # no need to work more
print("The list is consecutive.") # if you arrived here, it means the list is consecutive
但还没有找到一种方法将 x 定义为任何给定位置,只能定义特定位置
嗯,这就是 loops 的用途。这是最简单的版本
def is_consecutive(a_list):
is_consecutive = True
for x in range(1, len(a_list)):
if a_list[x] - a_list[x-1] != 1:
is_consecutive = False
break
if is_consecutive:
print("The list is consecutive.")
else:
print("The list is not consecutive.")
zip
函数 使编写变得更容易。
def is_consecutive(a_list):
is_consecutive = True
for current, previous in zip(a_list[1:], a_list[:-1])):
if current - previous != 1:
is_consecutive = False
break
all
作为一项陈述:
is_consecutive = all(current - previous == 1
for current, previous
in zip(a_list[1:], a_list[:-1]))
这样的东西应该有效。
def is_consecutive(array: list) -> bool:
sorted_lst = sorted(array)
for i in range(1, len(sorted_lst)):
if sorted_lst[i] != sorted_lst[i - 1] + 1:
return False
return True
如果所有数字都是连续的,则所有数字与其索引的差值将相同。因此,一组这些差异将只有一个项目:
def is_consecutive(L):
return len({n-i for i,n in enumerate(L)}) == 1
print(is_consecutive([5,6,7])) # True
print(is_consecutive([7,9,8])) # False
我不确定我是否理解了您的问题,您是否正在寻找一种迭代列表元素的方法?如果是这样,请使用
for i in range(len(your_list)):
# DO THINGS
解决这个问题的一个简单方法是检查列表中最大值和最小值之间的差是否等于列表长度减一,就像这样:
def is_consecutive(lst):
min_val = min(lst)
max_val = max(lst)
expected_length = max_val - min_val + 1
return len(lst) == expected_length