Python子字符串搜索不工作
name是一个元组列表,元组为len(1),包含字符串 当我使用: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 搜索成功,我得到了所需的结果。为什么
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