2015-06-02 2 views
0

У меня есть список:NameError при поиске подстроки в списке Python

mylist = ['item 101', 'element 202', 'string 303', 'member 404'] 

Я хочу, чтобы определить три цифры, связанные с «пункта», но «пункт» не всегда в том же положении, так что я не может использовать mylist[0].

Я посмотрел на принятый ответ в this StackOverflow post и попытался следующее:

if any('item' in s for s in mylist): 
    print(s) 

Я получаю следующее сообщение об ошибке:

NameError: name 's' is not defined 

В исследуемом эту ошибку, но я не смог найти любые примеры/решения, которые соответствуют этой конкретной ситуации.

+1

Причина вы получаете эту ошибку, потому что 's' только в области видимости жизни этого выражения генератора. Как только он исчерпан, и 'any()' возвращает значение '' '' '' больше не будет доступно. – IanAuld

ответ

1

Эта ошибка происходит из-за того, что вы пытаетесь просмотреть s до того, как s был определен в цикле for. Простая работа вокруг, что бы разорвать заявления друг от друга в:

for s in mylist: if 'item' in s: print(s)

3

Чем проще способ приблизиться к вашим проблемам является использованием списка понимания

>>> mylist = ['item 101', 'element 202', 'string 303', 'member 404'] 
>>> [s for s in mylist if 'item' in s] 
['item 101'] 

Если вы уверены, что есть только один элемент, как и в списке, то вы можете Aswell использование списки-индексы

>>> [s for s in mylist if 'item' in s][0] 
'item 101' 

Или лучшим способом было бы использовать next и gen-exp.

>>> next(s for s in mylist if 'item' in s) 
'item 101' 

И получить 3 цифры из строки 'item 101' вы можете сделать mystr[5:9] где mystr имеет значение 'item 101'

+0

Если вы уверены, что есть только один, лучше использовать 'next (s для s в mylist if 'item' in s)'. – orlp

+0

Aha! @orlp Да. Спасибо за это, я добавлю его в сообщение –

1

s существует только в рамках единого заявления:

'item' in s for s in mylist 

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

mylist = ['item 101', 'element 202', 'string 303', 'member 404'] 
items = [s for s in mylist if 'item' in s] 
if any(items): 
    print items[0] 
1

Я попытался ответить в связанном посте тоже, и впал в то же самое проблема. Однако, если вы используете правильное понимание, чтобы создать список булевых, он должен работать:

>>> mylist = ['item 101', 'element 202', 'string 303', 'member 404'] 
>>> if any(['item' in s for s in mylist]): 
...  print 'Found item' 

печатает, что, как ожидается.

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