Python 子字符串搜索无效

1 投票
2 回答
2353 浏览
提问于 2025-04-18 14:49

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

一个问题是,在第一个例子中,namereturn 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()。这里有一个使用 enumeratenext 的生成器表达式的例子,供学习参考:

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

撰写回答