是否有一种方法可以看到在python中使用任何函数时发现了哪个列表项?



我有一个我想在文本文件中找到的单词列表。现在我正在尝试any方法来迭代文件中的行。它返回TrueFalse正确,所以它工作良好。

我的问题是,如果有可能看到它找到了哪个单词?我可以看到我的代码和文本词被发现,但我想在代码中使用它如果可能的话。

下面是我意思的一个例子。如果line中有任何单词,则此代码返回TrueFalse

list_of_words = ['apple', 'banana', 'lemon']
with open(file, 'r') as f:
lines = f.readlines()
for line in lines:
x = any(word in line for word in list_of_words)
print(x)

您可以使用next代替,如果没有找到元素,则使用default

x = next((word for word in list_of_words if word in line), None)
if x is not None:
...

如果None可以是列表中的一个元素,你可以使用一些专门的哨兵对象来代替,例如

not_in = object()
x = next((word for word in list_of_words if word in line), not_in)
if x is not not_in:
...

或者显式捕获StopIteration错误:

try:
x = next(word for word in list_of_words if word in line)
...
except StopIteration:
pass
注意所有的方法只给你第一个这样的元素,然后停止检查其余的(像any一样);相反,如果您对所有这样的元素感兴趣,则应该像另一个答案一样使用列表推导式。

不使用any,而是使用一个简单的列表推导式,如下所示:

x = [word for word in list_of_words if word in line]

这将返回该行

中的单词列表

理想情况下,您希望使用set而不是把重要的词列表。如果你只想知道找到了哪些单词,而不关心它们被找到了多少次,那么这个就可以了:


words = set(['apple', 'banana', 'lemon'])
with open(file, 'r') as f:
lines = f.readlines()
for line in lines:
words_in_line = set(line.split()) # or however else you want to put them in a set.
for word in words_in_line.intersection(words):
print(word)

从另一个评论中借用一点,一个更好的解决方法是:

words = set(['apple', 'banana', 'lemon'])
with open(file, 'r') as f:
lines = f.readlines()
for line in lines:
words_in_line = (word for word in line.split() if word in words)
for word in words_in_line:
print(word)

这利用了这样一个事实,即生成器对象,即通过遍历行中的单词创建的对象也是一个可迭代对象,因此,如果它为空,迭代将立即停止,如果存在任何元素,它将遍历它们。

可以使用赋值运算符:=:

list_of_words = ["apple", "banana", "lemon"]
sample_lines = [
"this is line 1",
"this line 2 has banana in it.",
"this is line 3",
]
for line in sample_lines:
if any((found_word := word) in line for word in list_of_words):
print(found_word)

打印:

banana

最新更新