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

NameError when searching for substring in Python list

我有一个列表:

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

我想识别与'item'关联的三个数字,但是'item'并不总是在同一个位置,所以我不能使用mylist[0]

我查看了 this Whosebug post 中已接受的答案,并尝试了以下操作:

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

我收到以下错误:

NameError: name 's' is not defined

我研究了那个错误,但我没能找到适合这个特定情况的 examples/solutions。

解决问题的更简单方法是使用列表理解

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

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]

我也尝试了您链接 post 中的答案,并且 运行 遇到了同样的问题。但是,如果您使用适当的理解来创建布尔值列表,它应该可以工作:

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

打印出预期的内容。

发生该错误是因为您试图在 for 循环中定义 s 之前查看 s。一个简单的解决方法是将语句分成:

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