Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2011 20:26:07

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Для такого дела и я не останусь в стороне. Ищем 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



Отредактировано (Янв. 15, 2011 20:37:09)

Офлайн

#2 Янв. 15, 2011 20:55:15

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Isem Раза в два пошустрей у тебя будет, я просто в основном под 2.5 сижу, там нет такого enumerate со вторым параметром.



Офлайн

#3 Янв. 15, 2011 21:08:43

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Ну а я сразу начал с 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



Отредактировано (Янв. 16, 2011 00:27:41)

Офлайн

#4 Янв. 15, 2011 23:14:45

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

alexx11
Isem Раза в два пошустрей у тебя будет, я просто в основном под 2.5 сижу, там нет такого enumerate со вторым параметром.
в 2.6 (где есть ТАКОЙ enumerate) оба варианта примерно одинаковы по скорости.



Офлайн

#5 Янв. 16, 2011 00:51:37

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

appetito
в 2.6 (где есть ТАКОЙ enumerate) оба варианта примерно одинаковы по скорости.
А попробуйте с такими списками:
S = list(range(5000))
L = [0]*100000 + S



Офлайн

#6 Янв. 16, 2011 14:58:50

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Да, “быстрое” решение, как всегда, не точное.
Проверка на подпоследовательность (в математическом смысле).

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

Офлайн

#7 Янв. 16, 2011 21:58:56

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.



Офлайн

#8 Янв. 16, 2011 22:10:48

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Вот теперь давайте по порядку.

Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.
Читаем тему:
“проверить вхождение последовательности в список”.
То что у Вас понятие последовательности не ассоциируется с математической последовательностью — Ваша личная проблема. Я предложил все варианты.
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.
Источник моей “копипасты” в студию, “уважаемый”.

Отредактировано (Янв. 16, 2011 22:13:01)

Офлайн

#9 Янв. 17, 2011 09:59:11

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

По порядку, так по порядку.

Ferroman
Читаем тему:
“проверить вхождение последовательности в список”.
То что у Вас понятие последовательности не ассоциируется с математической последовательностью — Ваша личная проблема. Я предложил все варианты.
А с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.
Ferroman
Источник моей “копипасты” в студию,  “уважаемый”
Возможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.



Офлайн

#10 Янв. 17, 2011 10:44:42

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как проверить вхождение последовательности в список?

Isem

А с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.
Вот из-за несоответствия терминологии и примеров я дал 2 варианта.
Возможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.
Принято.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version