提问人:Codingamethyst 提问时间:9/2/2022 最后编辑:halferCodingamethyst 更新时间:9/5/2022 访问量:107
检查单词是否存在于列表的特定位置
Check if a word exists at a particular position of a list
问:
假设我有一个列表列表。
List1=[["Red is my favorite color."],["Blue is her favorite."], ["She is really nice."]]
现在我想检查一组单词之后是否存在“is”这个词。
我做了一个词 liseword_list=['Red', 'Blue']
有没有办法使用 if 语句来检查?
如果我写 It 将返回 List1 中的所有三个句子,我希望它返回前两个句子。 if 'is' in sentences:
有没有办法检查单词“is”是否正好位于word_list中的单词之后?先谢谢你。
答:
2赞
PepeChuy
9/2/2022
#1
你可以试试这个:
List1 = [['Red is my favorite color.'],['Blue is her favorite.'], ['She is really nice.']]
listResult = []
word_list = ['Red', 'Blue']
for phrase in List1:
for word in word_list:
if f'{word} is' in phrase[0]:
listResult.append(phrase[0])
评论
2赞
mozway
9/2/2022
请注意,此解决方案是二次的(即对于大型列表来说速度较慢)。
0赞
ben
9/2/2022
#2
已经回答了。
请参阅模块文档:https://docs.python.org/3/library/re.html
堆栈溢出之前回答的问题:检查字符串是否与模式匹配
评论
0赞
Codingamethyst
9/2/2022
2.实际上,我判定了标记化的数据列表,这就是我最终得到包含单个字符串的列表列表的方式。
3赞
mozway
9/2/2022
#3
铌。我假设字符串的开头有匹配项。对于任何位置的匹配,请使用 re.search
而不是 re.match
。
您可以使用正则表达式:
import re
regex = re.compile(fr'\b({"|".join(map(re.escape, word_list))})\s+is\b')
# regex: \b(Red|Blue)\s+is\b
out = [[bool(regex.match(x)) for x in l]
for l in List1]
输出:[[True], [True], [False]]
使用的输入:
List1 = [['Red is my favorite color.'],
['Blue is her favorite.'],
['She is really nice.']]
word_list = ['Red', 'Blue']
如果你想要这些句子:
out = [[x for x in l if regex.match(x)]
for l in List1]
输出:
[['Red is my favorite color.'],
['Blue is her favorite.'],
[]]
或作为平面列表:
out = [x for l in List1 for x in l if regex.match(x)]
输出:
['Red is my favorite color.',
'Blue is her favorite.']
评论
0赞
mozway
9/2/2022
@Codingamethyst请注意,我假设字符串的开头匹配。对于任何地方的匹配,请使用而不是re.search
re.match
0赞
mozway
9/2/2022
正则表达式在字符串级别工作,完全不知道容器。我不确定您指的是我的哪种替代方案,但请用具有预期输出的清晰示例更新您的问题。
0赞
Codingamethyst
9/2/2022
您的答案工作正常,我想知道是否有办法删除 [] 空列表,因为我从 4000 个数据集中获得了 5000+ 个空列表。我已经使用过滤器删除了它,我想知道是否可以使用正则表达式本身来做到这一点。
0赞
mozway
9/2/2022
不,不是。如上所述,正则表达式不了解列表,只知道列表中包含的字符串。您需要使用后处理进行过滤。
0赞
Codingamethyst
9/2/2022
另一个愚蠢的问题,对不起,但是是否可以检查多个单词列表。而不是word_list,如果我有两个或三个列表,是否可以使用类似 or 运算符的东西来检查所有列表?我总是可以合并并制作 1 个列表,但我想知道是否可以在正则表达式中执行。我再次为这个愚蠢的问题感到抱歉
评论