Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子字符串搜索不工作_Python_String_Generator - Fatal编程技术网

Python子字符串搜索不工作

Python子字符串搜索不工作,python,string,generator,Python,String,Generator,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 搜索成功,我得到了所需的结果。为什么

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
搜索成功,我得到了所需的结果。为什么会出现这种不同的行为?

中,如果word In(name[0]表示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()
。下面是一个使用
枚举
下一步
以及生成器表达式进行学习的示例:

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

一个问题是,在第一个示例中,
name
不在
返回名称[0]
的范围内


如果代码返回
None
而不是抛出异常,那么您有另一个名为
name

的(全局?)变量,但是如何
以这种方式返回name[0]
呢?@tobias_k Oops!我错过了这一部分,更新了答案。谢谢你的帮助,但这种行为非常奇怪……为什么它会这样检查确切的字符串,这是语义原因?@svetaketu该语法实际上检查生成器是否包含该项。它相当于:
lst=[name[0]表示t中的名称];'在lst中,唯一的区别是没有创建列表,只要找到匹配项,它就会短路。
>>> item = next((name[0] for name in t if 'oo' in name[0]), None)
>>> if item is not None:                                         
    print item
...     
foo