我在运行 python 程序时遇到问题。目的是确定序列
1, 2, 3
是否在给定的 int
列表内。当它运行其中两个测试时,代码就可以工作。然而,第三次测试失败了,我不明白为什么。
我的代码是:
def has123(nums):
s = ''.join(str(i) for i in sorted(nums))
if '123' in s:
return True
else:
return False
当传递参数
[1, 1, 2, 3, 1]
和 [1, 1, 2, 4, 1]
时,它返回正确的输出,但对于 [1, 1, 2, 1, 2, 3]
则不然。
从
sorted()
中删除
s = ''.join(str(i) for i in sorted(nums))
sorted()
对列表进行排序并按升序排列
因此,在您的情况下,使用
[1, 1, 2, 1, 2, 3]
时,'111223'
会转换为sorted()
,因此无法找到模式
如果您确实需要顺序连续且按顺序(这就是我对措辞的理解),您可以:
1
,1
,检查它是否是1,2,3
def has123(nums):
all_1_idx = (i for i,n in enumerate(nums) if n==1)
for i in all_1_idx:
if nums[i:i+3] == [1,2,3]:
return True
return False
我看不到哪里要求排序或相关排序。
试试这个代码:
def has123(nums: list) -> bool:
for i in range(len(nums)-2):
if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3:
return True
return False
这是正在发生的事情:
[1,2,3]
,即 3 个元素。[1, 1, 2, 1, 2, 3]
为例。长度是 6。我们从中减去 2,我稍后会解释为什么,得到 4。range(len([1, 1, 2, 1, 2, 3]) - 2)
,这给了我们一个列表或范围,如下所示:[0,1,2,3]
。len(nums)
中减去 2 的原因是为了防止超出范围的错误,以便我们可以检查列表的最后三个元素。简而言之,此代码使用 range 函数提供的索引快速移动并逐个字符地检查。