Найти - Пользователи
Полная версия: Как проверить вхождение последовательности в список?
Начало » Python для новичков » Как проверить вхождение последовательности в список?
1 2 3
Isem
Для такого дела и я не останусь в стороне. Ищем S в L.
def is_sublist(L, S):
index = -1
S_len = len(S)
stop = len(L)-S_len + 1
while S_len:
try:
index = L.index( S[0], index+1, stop )
if all( i==L[ind] for ind, i in enumerate(S, index) ):
return True
except ValueError: return
alexx11
Isem Раза в два пошустрей у тебя будет, я просто в основном под 2.5 сижу, там нет такого enumerate со вторым параметром.
Isem
Ну а я сразу начал с 3-го питона, нет у меня необходимости в библиотеках, которые написаны только для питона 2.x. Тем более numpy и scipy для 3.1. уже вышли. Осталось только дождаться matplotlib для полного счастья.
Ну и напоследок незагроможденный вариант с выброшенными не столь важными нюансами оптимизации.
def is_sublist(L, S):
try:
index = -1
while 1:
index = L.index( S[0], index+1 )
if all( i==L[ind] for ind, i in enumerate(S, index) ):
return True
except (ValueError, IndexError): pass
appetito
alexx11
Isem Раза в два пошустрей у тебя будет, я просто в основном под 2.5 сижу, там нет такого enumerate со вторым параметром.
в 2.6 (где есть ТАКОЙ enumerate) оба варианта примерно одинаковы по скорости.
Isem
appetito
в 2.6 (где есть ТАКОЙ enumerate) оба варианта примерно одинаковы по скорости.
А попробуйте с такими списками:
S = list(range(5000))
L = [0]*100000 + S
Ferroman
Да, “быстрое” решение, как всегда, не точное.
Проверка на подпоследовательность (в математическом смысле).
def is_subsequence(sub_seq, seq):
""" Return True if sub_seq is subsequnce of seq.
Used algorithm for solving of the small sample size problem.

>>> is_subsequence([1, 2], [1, 2, 3])
True
>>> is_subsequence([2, 1], [1, 2, 3])
False
>>> is_subsequence([1, 2], [1, 22, 3])
False
>>> is_subsequence([1, 2, 3], [1, 2])
False
>>> is_subsequence([1, 2], [1, 3, 2])
True
"""
sub_seq_index = len(sub_seq) - 1
seq_index = len(seq) - 1
if sub_seq_index > seq_index:
return False

while sub_seq_index and seq_index:
if sub_seq[sub_seq_index] == seq[seq_index]:
sub_seq_index -= 1
seq_index -= 1
else:
seq_index -=1
if (seq_index == 0 and sub_seq_index == 0) or (seq_index and sub_seq_index == 0):
return True
else:
return False
Ну и поиск под-списка в списке
def is_sublist(pattern, seq):
""" Return True if sub_seq is subsequnce of seq.
Used Knuth-Morris-Pratt algorithm.

>>> is_sublist([1, 2], [1, 2, 3])
True
>>> is_sublist([2, 1], [1, 2, 3])
False
>>> is_sublist([1, 2], [1, 22, 3])
False
>>> is_sublist([1, 2, 3], [1, 2])
False
>>> is_sublist([1, 2], [1, 3, 2])
False
"""
def get_prefix():
""" Get prefix function
>>> get_prefix(list('ababaa'))
[-1, 0, 0, 1, 2, 3, 1]
"""
prefix = [0]*pattern_length
j = 0
for i in range(1, pattern_length):
while (j>0) and pattern[i]!=pattern[j]:
j = prefix[j-1]
if pattern[j] == pattern[i]:
j += 1
prefix[i] = j
return [-1]+prefix

pattern_length = len(pattern)
seq_length = len(seq)

if pattern_length > seq_length:
return False

prefix = get_prefix()

j = 0
for item in seq:
while j>=0 and pattern[j]!=item:
j = prefix[j]

j += 1
if j==pattern_length:
return True

return False
Isem
Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.
Ferroman
Вот теперь давайте по порядку.
Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.
Читаем тему:
“проверить вхождение последовательности в список”.
То что у Вас понятие последовательности не ассоциируется с математической последовательностью — Ваша личная проблема. Я предложил все варианты.
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.
Источник моей “копипасты” в студию, “уважаемый”.
Isem
По порядку, так по порядку.
Ferroman
Читаем тему:
“проверить вхождение последовательности в список”.
То что у Вас понятие последовательности не ассоциируется с математической последовательностью — Ваша личная проблема. Я предложил все варианты.
А с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.
Ferroman
Источник моей “копипасты” в студию,  “уважаемый”
Возможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.
Ferroman
Isem
А с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.
Вот из-за несоответствия терминологии и примеров я дал 2 варианта.
Возможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.
Принято.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB