2014-02-21 2 views
0

Я сделал некоторые кодирования и здесь он идет:Как совместить элементы списка с разной длиной подстроки строки?

s='hello world' 
lst=['he','hel','wor'] 
i=0 
for ch in lst: 
    for i in range(len(s)): 
     if s[i:i+len(ch)]==ch: 
      contains=True    

     else: 
      contains=False 

     i+=1 
print(contains) 

и я не получаю правильный возврат. Может кто-нибудь, пожалуйста, взгляните и дайте мне несколько указателей, пожалуйста? Благодаря

+1

Рассмотрите это: если 'contains' является' False' на одной итерации, оно может стать 'True' в следующем. Но действительно ли это возможно? – kojiro

ответ

5
contains = all(sub in s for sub in lst) 

[sub in s for sub in lst] список понимание, что имеет значение sub in s для каждого элемента sub в lst. В принципе, он возвращает True для каждого элемента в s, который присутствует в lst, и False для каждого элемента, который НЕ присутствует в lst. all() - это функция, которая возвращает True, если ВСЕ элементы в итерабельном, которые вы передаете, являются правдивыми. Сравните с any(), который возвращает True, если ANY-элемент в его итерабельном объекте правдивый, например. вы могли бы сделать contains = not any(sub not in s for sub in lst)

+0

Это действительно хорошо. Я не знал об этом. Спасибо за этот аккуратный способ решить проблему. –

1

Есть, конечно, несколько способов, чтобы сделать его короче, но вот модификация вашей программы, которая должна работать:

s = 'hello world' 
lst = ['he','rld','wor'] 
i = 0 
containsall = True 

for ch in lst: 
    contains = False 
    for i in range(len(s) - len(ch) + 1): 
     if s[i:i+len(ch)] == ch: 
      contains = True    
      break 

    if not contains: 
     containsall = False 
     break 

print(containsall) 

В принципе, как только строки, найденных в слове, мы перерыв и переход к следующему слову. В противном случае эта строка не находится в s, и нам не нужно проверять оставшиеся слова, и мы выходим из основного цикла. Если все подстроки пройдены с 'содержит being True, we never get to containsall = False`, и поэтому он является True общим; в противном случае он вернет False.

+0

Это более подробный способ сделать то же самое. Спасибо за работу над проблемой. –

Смежные вопросы