【问题标题】:NameError when searching for substring in Python list在 Python 列表中搜索子字符串时出现 NameError
【发布时间】:2015-06-02 14:22:24
【问题描述】:

我有一个清单:

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

研究了该错误,但我找不到任何适合这种特殊情况的示例/解决方案。

【问题讨论】:

  • 您收到此错误的原因是因为s 仅在该生成器表达式的生命周期内。一旦它用尽并且any() 返回它的值s 将不再可用。

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


【解决方案1】:

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

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

【讨论】:

  • 如果你确定只有一个,最好使用next(s for s in mylist if 'item' in s)
  • 啊哈! @orlp 是的。谢谢你,我会把它添加到帖子中
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    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]
    

    【讨论】:

      【解决方案4】:

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

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

      打印出预期的内容。

      【讨论】:

        猜你喜欢
        • 2016-04-21
        • 2016-04-20
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        相关资源
        最近更新 更多