【问题标题】:Python substring search not workingPython子字符串搜索不起作用
【发布时间】:2014-07-25 21:22:48
【问题描述】:

name 是 len(1) 且包含字符串的元组列表

当我使用时:

if word in (name[0] for name in t):
        return name[0]
return None

然后我没有得到(搜索不成功)

但如果我使用相同的单词值和相同的列表:

gen=(name[0] for name in t)
for i in gen:
    if word in i:
        return i
return None

搜索成功,我得到了所需的结果。为什么会有如此不同的行为?

【问题讨论】:

    标签: python string generator


    【解决方案1】:

    if word in (name[0] for name in t) 中,您实际上是在搜索确切的字符串而不是子字符串,即生成器是否包含确切的单词。

    改为使用any():

    if any(word in name[0] for name in t):
    

    演示:

    >>> t = [('foo',), ('bar',)]
    >>> any('oo' in name[0] for name in t)
    True
    >>> 'oo' in (name[0] for name in t)
    False
    >>> 'foo' in (name[0] for name in t)
    True
    

    请注意,如果您想返回匹配的项目,那么最好使用您的第二个代码(只需删除不必要的genexpr,直接循环t),如果您只想检查是否存在子字符串然后使用any()。下面是一个使用 enumeratenext 与生成器表达式进行学习的示例:

    >>> item = next((name[0] for name in t if 'oo' in name[0]), None)
    >>> if item is not None:                                         
        print item
    ...     
    foo
    

    【讨论】:

    • 但是如何return name[0] 这种方式?
    • @tobias_k 哎呀!我错过了那部分,更新了答案。
    • 感谢您的帮助,但这种行为很奇怪......为什么它会以这种方式检查确切的字符串,这是语义上的原因?
    • @svetaketu 该语法实际上检查生成器是否包含该项目。相当于:lst = [name[0] for name in t]; 'oo' in lst,唯一的区别是不创建列表,只要找到匹配项就会短路。
    【解决方案2】:

    一个问题是,在第一个示例中,name 不在return name[0] 的范围内。

    如果代码返回 None 而不是抛出异常,则您有另一个(全局?)变量,称为 name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-18
      • 2011-11-30
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多