Python 子字符串搜索无效
name 是一个包含元组的列表,这些元组的长度都是 1,并且里面的内容是字符串。
当我使用:
if word in (name[0] for name in t):
return name[0]
return None
时,我得到了 None(搜索没有成功)。
但是如果我用相同的单词和相同的列表,使用:
gen=(name[0] for name in t)
for i in gen:
if word in i:
return i
return None
搜索就成功了,我得到了想要的结果。为什么会有这样的不同表现呢?
2 个回答
0
一个问题是,在第一个例子中,name
在 return name[0]
这个地方是无法使用的。
如果代码返回的是 None
而不是抛出错误,那说明你可能有另一个叫 name
的变量(可能是全局变量)。
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
需要注意的是,如果你想返回匹配的项,那么最好使用你第二段代码(只需去掉不必要的生成器表达式,直接遍历 t
)。如果你只是想检查某个子字符串是否存在,那么就用 any()
。这里有一个使用 enumerate
和 next
的生成器表达式的例子,供学习参考:
>>> item = next((name[0] for name in t if 'oo' in name[0]), None)
>>> if item is not None:
print item
...
foo