在Python列表中搜索子字符串时的NameError

时间:2015-06-02 14:22:24

标签: python list python-3.x list-comprehension

我有一个清单:

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

我想识别与' item'相关联的三位数字,但是' item'并不总是处于同一位置,因此我无法使用mylist[0]

我查看了this StackOverflow post中接受的答案,并尝试了以下内容:

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

我收到以下错误:

NameError: name 's' is not defined

在研究这个错误时,我还没有找到适合这种特殊情况的任何示例/解决方案。

4 个答案:

答案 0 :(得分:3)

解决问题的简单方法是使用列表推导

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

如果您确信列表中只有一个这样的元素,那么您还可以使用列表索引

>>> [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'

要获取字符串'item 101'中的3位数,您可以mystr[5:9] mystr的值为'item 101'

答案 1 :(得分:1)

仅存在于单个语句的范围内:

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}}

答案 2 :(得分:1)

我也在您的链接帖子中尝试了答案,并遇到了同样的问题。但是,如果您使用正确的理解来创建布尔列表,它应该可以工作:

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

打印出预期的内容。

答案 3 :(得分:1)

发生这种错误是因为你试图在for循环中定义s之前查看s。一个简单的解决方法是将这些陈述分解为:

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