Python - разные методы сопоставления последовательностей в массиве? - PullRequest
1 голос
/ 21 июня 2020

Я новичок в программировании и использую Codingbat для изучения python основ. Мне интересно узнать о разнице между двумя методами сопоставления последовательностей в массивах python ниже. Я понимаю, что разница может быть произвольной, но просто хотел узнать, лучше ли их решение по каким-либо причинам.

Спасибо

Учитывая массив целых чисел, вернуть True, если последовательность где-то в массиве появляются числа 1, 2, 3.

мое решение

  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

Ответы [ 3 ]

2 голосов
/ 21 июня 2020

Первое отличие состоит в том, что в вашем решении вы сравниваете срез списка (nums [i: i + 3]) и целевой список (seq), тогда как данное решение является целочисленным сравнением.

Во-вторых, ваш решение имеет для l oop, который выполняет итерацию по всем элементам массива "nums", но, например, если до последнего 3-го элемента не будет найдена '1' (первый элемент последовательности), проверка последних двух элементов всегда будет быть расточительством. С другой стороны, данное решение повторяет в два раза меньше, чем вся последовательность, задав диапазон (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 Нет

0 голосов
/ 21 июня 2020

Нет такой большой разницы. Одно отличие состоит в том, что ваш l oop в последних значениях выполняет итерацию по элементу вне диапазона, а их решение повторяется до последних трех элементов: например, с этим nums=[1,4,6,1,2,3] и seq=[1,2,3], i идет принимать значения от 0 до len(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

Короче говоря, различия - это циклы, и вы сравниваете фрагмент за фрагментом, а их решение сравнивает поштучно.

0 голосов
/ 21 июня 2020

Если вы используете ваше решение, при проверке последнего int в списке. Может быть ошибка индекса вне допустимого диапазона. Остерегайтесь этих мелких ошибок.

...