【问题标题】:Python - different methods of sequence matching in an array?Python - 数组中序列匹配的不同方法?
【发布时间】:2020-06-21 15:43:54
【问题描述】:

我是编码新手,正在使用 Codingbat 学习 Python 基础知识。我想知道下面python数组中两种序列匹配方法之间的区别。我知道差异可能是任意的,但只是想知道他们的解决方案是否出于任何原因而优越。

谢谢

给定一个整数数组,如果数字序列 1、2、3 出现在数组中的某个位置,则返回 True。

我的解决方案

  for i in range(len(nums)):
    if nums[i:i+3] == seq:
      return True

他们的解决方案:

for i in range(len(nums)-2):
    if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3:
      return True

【问题讨论】:

    标签: python arrays pattern-matching


    【解决方案1】:

    第一个区别是,在您的解决方案中,您正在比较列表切片 (nums[i:i+3]) 和目标列表 (seq),而给定的解决方案是整数比较。

    其次,您的解决方案具有迭代“nums”数组的所有元素的 for 循环,但例如,如果直到最后一个第三个元素,没有找到“1”(序列的第一个元素),检查最后两个元素永远是浪费。另一方面,通过给出 range(len(nums)-2),给定解决方案的迭代次数比整个序列少两倍。这比您给出的解决方案稍微优化了一点。

    nums=[5,6,7,2,3,1]
    seq=[1,2,3]
    def sequence(nums):
        for i in range(len(nums)):
            print(nums[i])
            if nums[i:i+3]==seq:
                return True
    print(sequence(nums))
    

    输出: 5 6 7 2 3 1 无

    给定解决方案:

    nums=[5,6,7,2,3,1]
    seq=[1,2,3]
    
    def sequence2(nums):
        for i in range(len(nums)-2):
            print(nums[i])
            if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3:
                return True
    
    print(sequence2(nums))
    

    输出: 5 6 7 2 无

    【讨论】:

    • 这是一个很好的答案。我建议将 nums[i:i+3] 描述为列表 slice 而不是列表,并从示例中删除反引号。
    【解决方案2】:

    没有那么大的区别。一个区别是,您的循环在最后一个值中迭代一个超出范围的项目,并且它们的解决方案迭代直到最后三个元素: 例如,对于nums=[1,4,6,1,2,3]seq=[1,2,3]i 将采用介于 0len(nums)-1 之间的值,也就是说在这种情况下是 i=[0,1,2,3,4,5],并且 您的解决方案迭代将是这样的:

    i=0
    nums[i:i+3]=nums[0:3]->[1,4,6]
    nums[0:3] == seq ->False
    ...
    i=1
    nums[i:i+3]=nums[1:4] ->[4,6,1]
    nums[i:i+3] == seq ->False
    ....
    #and so on
    

    但是在最后三个元素 (i=len(nums)-3) 之后,继续比较没有意义,因为列表的长度会不同:

    i=len(nums)-3=3
    nums[i:i+3]=nums[3:6] ->[1,2,3]
    nums[i:i+3] == seq ->True
    return True
    ...
    i=len(nums)-2=4
    nums[i:i+3]=nums[4:7] ->[2,3]
    nums[i:i+3] == seq ->False
    ...
    i=len(nums)-1=5
    nums[i:i+3]=nums[5:8] ->[3]
    nums[i:i+3] == seq ->False
    ...
    #End loop
    

    所以也许您可以使用 range(len(nums)-2),最后一次迭代 i=len(nums)-3。 另一种解决方案,正如我向您解释的那样,迭代直到i=len(nums)-3,并逐项比较:

    i=0
    nums[i]=nums[0]-> 1
    nums[i+1]=nums[1]-> 4
    nums[i+1]=nums[2]-> 6
    nums[i]==1 and nums[i+1]==2 and nums[i+2]==3 --->False
    ...
    #and so on until i i=len(nums)-3
    

    简而言之,区别在于循环,您可以逐个切片进行比较,而他们的解决方案是逐项比较。

    【讨论】:

      【解决方案3】:

      如果使用您的解决方案,则在检查列表中的最后一个 int 时。它可能存在索引超出范围的错误。小心这些小错误。

      【讨论】:

      • 当我在他们的控制台中运行我的解决方案时,它通过了所有测试用例,这就是为什么我想知道这两种解决方案之间是否存在有意义的差异。谢谢
      • 切片不会给出索引错误。例如:[1,2][0:10] 只返回[1, 2]
      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 2015-08-19
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2021-02-08
      相关资源
      最近更新 更多