如何判断序列是否在整数列表内?

问题描述 投票:0回答:3

我在运行 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]
则不然。

python list sequence traversal
3个回答
0
投票

sorted()
 中删除 
s = ''.join(str(i) for i in sorted(nums))

sorted()
对列表进行排序并按升序排列

因此,在您的情况下,使用

[1, 1, 2, 1, 2, 3]
时,
'111223'
会转换为
sorted()
,因此无法找到模式


0
投票

如果您确实需要顺序连续且按顺序(这就是我对措辞的理解),您可以:

  • 迭代列表中的所有
    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

0
投票

我看不到哪里要求排序或相关排序。

试试这个代码:

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 函数提供的索引快速移动并逐个字符地检查。

© www.soinside.com 2019 - 2024. All rights reserved.