2013-05-11 2 views
-1

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

m = "college" 
s = "col" 
lm = len(m) 
ls = len(s) 
f = 0 

for i in range(lm):  
    if (i+ls) <= lm: 
     if s == m[i:(i+ls)]:    
      global f 
      f = 1 
      break 
if f: 
    print "present" 
else: 
    print "not present" 

Что я делаю здесь, если моя подстрока col, моя программа проверяет строку длиной подстроки с подстрокой, двигаясь от начала до конца основной струны и возвращает истину или не.

col 
oll 
lle 
leg 
ege     
+0

Вы ищете лучший/отличный способ написания кода или для более разумного алгоритма? В буквальном смысле очевидным «другим способом достижения» поиска является использование оператора 'in'. Существует много способов написания кода по-разному, некоторые из них указаны в ответах. Существуют также более разумные алгоритмы, которые можно использовать для поиска подстроки, как указано в моем ответе. Просьба уточнить. – user4815162342

+0

Я прочитал решения, и это было то, что я ожидал ... Если вы можете предоставить мне еще более эффективные алгоритмы PLZ, скажите, что это будет полезно для меня .... – abu

+0

Мой ответ делает именно это, но вам понадобится закодировать их самостоятельно. – user4815162342

ответ

1

Вы могли бы попробовать что-то вроде этого:

In [1]: m = 'college' 

In [2]: s = 'col' 

In [3]: if any(m[i:i+len(s)] == s for i in range(len(m)-len(s)+1)): 
    ...:  print 'Present' 
    ...: else: 
    ...:  print 'Not present' 
    ...:  
Present 

Где any проверяет каждую подстроку m длины len(s) и видит, если он равен s. Если это так, он возвращает True и останавливает дальнейшую обработку (это называется «короткое замыкание» и очень похоже на break, который у вас выше).

Вот что any часть будет выглядеть, если мы заменили его список понимания и вынули сравнение равенства:

In [4]: [m[i:i+len(s)] for i in range(len(m)-len(s)+1)] 
Out[4]: ['col', 'oll', 'lle', 'leg', 'ege'] 
+0

Спасибо, братан .... Я действительно понял мою проблему и разъяснил мне .... – abu

+0

@abu Нет проблем, удачи всем :) – RocketDonkey

1

Вам не нужно global там. Кроме того, вы можете сделать

In [1]: %paste 
m = "college" 
s = "col" 

In [2]: 'not ' * all(s != m[i:i+len(s)] for i in range(1+len(m)-len(s))) + 'present' 
Out[2]: 'present' 

Но на самом деле вы, конечно, должны просто сделать s in m,

+0

Ха-ха, это довольно здорово, +1 – RocketDonkey

2

Ваш код является законным способом быстро реализовать общий поиск подстроки, но не единственный. Более эффективные алгоритмы включают Boyer-Moore string search, Knuth-Morris-Pratt search или поиск осуществляется с помощью DFA.

Это большая тема, и ваш вопрос не дает понять, какую информацию вы на самом деле после. В случае Python, конечно, наиболее эффективно просто использовать оператор in и связанные с ним методы str.find и str.index, все из которых развертывают simplified Boyer-Moore.

0

Эта проблема требует функционального решения:

def strcomp(s, subs): 
    if len(s) < len(subs): 
     return False 
    elif s[0:len(subs)] == subs: 
     return True 
    else: 
     return strcomp(s[1:], subs) 

Вы называете рекурсивно функцию strcomp, каждый раз с «длинной» строкой - s теряют свою голову, пока вы либо найти subs в первой позиции или s становится короче subs.

+0

Спасибо, что предоставили мне хорошее рекурсивное решение .... – abu