2014-01-16 1 views
1

Я могу определить совпадения, но не могу найти, где они.Python: если список содержит строку, напечатайте все индексы/элементы в списке, которые содержат его

Учитывая следующий список:

['A second goldfish is nice and all', 3456, 'test nice'] 

мне нужно искать матч (то есть «хороший») и напечатать все элементы списка, которые содержат его. В идеале, если ключевое слово для поиска было «хорошо» результаты должны быть:

'A second goldfish is nice and all' 
'test nice' 

У меня есть:

list = data_array 
string = str(raw_input("Search keyword: ")) 
print string 
if any(string in s for s in list): 
    print "Yes" 

Так она находит матч и печатает как, ключевое слово и «Да», но это Безразлично Скажите мне, где это.

Должен ли я перебирать каждый индекс в списке и для каждого поиска в строке поиска «строка в s» или есть более простой способ сделать это?

ответ

1

Попробуйте это:

list = data_array 
string = str(raw_input("Search keyword: ")) 
print string 
for s in list: 
    if string in str(s): 
     print 'Yes' 
     print list.index(s) 

Editted работать пример. Если вы хотите только первый совпадающий индекс можно также разбить после того, как если оператор оценивает истинный

+0

Я так и сказал, что список не содержит такого индекса. Я думаю, что я просто получаю его, просматривая каждую запись и каждый раз просматривая. Это всего лишь медленный метод. –

+0

Это не сработает, потому что 'string in s' возвращает True, если' string' является подстрокой 's', но' list.index (string) 'будет искать только там, где она есть, строка является элементом' element' в 'list'. – DSM

+0

Я отредактировал, чтобы исправить этот DSM. Есть ли преимущество в использовании списков, таких как опубликовано Dan и bainikolaus? Я считаю, что моя версия намного читаема –

3
matches = [s for s in my_list if my_string in str(s)] 

или

matches = filter(lambda s: my_string in str(s), my_list) 

Обратите внимание, что 'nice' in 3456 поднимет TypeError, поэтому я использовал str() в списке элементы. Соответствует ли это, зависит от того, хотите ли вы принять '45' в 3456 или нет.

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