список и подсписок питона - PullRequest
1 голос
/ 01 марта 2011

Я должен проверить, содержится ли list1 в list2. Это также должно проверить, появляется ли это в том порядке в списке также. Если это правда, он должен возвращать истину и ложь, если это не так.

def check(lst1, lst2):
for x in lst1:
    for y in lst2:
        xx = lst1.sort()
        yy = lst2
        if xx != yy:
            return False
        else:
            return True

Я путаю себя с циклами for, а также не знаю, куда идти дальше, чтобы исправить мой код. Указатели, пожалуйста?

пример того, что он должен делать:

  check([4,0],[9,1,4,6,8,9])
  True
  check([1,2],[2,3,1])
  False

Ответы [ 3 ]

3 голосов
/ 01 марта 2011

Я думал, что проблема требует рекурсивного решения, поэтому я сделал:

def check(needle, haystack):
  if not needle:
      return True
  try:
    offset = haystack.index(needle[0])
    return check(needle[1:], haystack[offset+1:])
  except:
    return False

Редактировать:

Краткое объяснение:

Сначала мы проверим, если списокмы ищем пустой (это важно, как только мы начинаем называть себя), так как все списки имеют пустой список внутри, мы возвращаем True.Затем мы пытаемся найти первый элемент списка, который мы ищем, в списке, на который мы смотрим.Если мы найдем его, мы снова вызовем функцию, но немного изменим аргументы: мы уже посмотрели на первый элемент «иглы» и увидели его в «стоге сена».Итак, теперь нам нужно проверить, находится ли остаток «иглы» в остатке «стога сена».Таким образом, мы вызываем функцию снова только с остатком от обоих списков.Остаток иглы - это все, кроме первого элемента, а остаток стога сена - все предметы после того, который мы нашли.Если мы дойдем до точки, где первый список пуст, это означает, что мы нашли его в стоге сена.Если мы получим исключение, то, что мы искали, не было найдено, поэтому мы возвращаем False, который пузырится в стеке вызовов и возвращается.

1 голос
/ 01 марта 2011

Вы можете начать с чего-то вроде:

set(lst1).issubset(lst2)

, чтобы увидеть, содержится ли lst1 в порядке игнорирования lst2.Если он проходит проверку того, что один список содержится в другом, то вы можете сделать что-то вроде:

ii = lst2.index(lst1[0])
if lst2[ii:ii+len(lst1)] == lst1:
   return True
else:
   return False

Первоначально я заявил, что первая проверка не имеет отношения к второй, хотя вам придется правильнообрабатывать ValueError, если первый элемент lst1 отсутствует в lst2.

Редактировать: Как примечание, я сравнил версию своего кода с ян и моя значительно быстрее почти во всех случаях, особенно если len (lst1) больше (вверхдо 200-кратного ускорения по сравнению с реализацией Яна).Попробуйте с модулем timeit.

def check(lst1,lst2):
    try:
        ii = lst2.index(lst1[0])
    except ValueError:
        return False

    if lst2[ii:ii+len(lst1)] == lst1:
        return True
    else:
        return False 

В качестве объяснения того, как это работает, ii = lst2.index(lst1[0]) находит индекс в lst2, который соответствует первому элементу lst1.Если этот элемент отсутствует в lst2, он ловит ValueError и возвращает False.Если этот элемент существует, lst2[ii:ii+len(lst1)] == lst1 сравнивает все lst1 с подсписком lst2, начиная с соответствующего элемента и принимая следующие len(lst) элементы.

0 голосов
/ 01 марта 2011
>>> a=[9,1,4,6,8,9]
>>> by_twos=zip(a, a[1:])
>>> by_twos
[(9, 1), (1, 4), (4, 6), (6, 8), (8, 9)]
>>> (4,6) in by_twos
True
...