Python 3.x 对弦的怀疑
所以,我正在用python做一个练习,我试图用终端一步一步地理解发生了什么,但我没有 我主要想了解为什么条件返回只返回索引0。 在[Casinoville].lower()中查看“casino”不是一回事吗 练习:Python 3.x 对弦的怀疑,python-3.x,string,Python 3.x,String,所以,我正在用python做一个练习,我试图用终端一步一步地理解发生了什么,但我没有 我主要想了解为什么条件返回只返回索引0。 在[Casinoville].lower()中查看“casino”不是一回事吗 练习: 获取文档列表(每个文档都是字符串)和关键字。 将索引值列表返回到包含关键字的所有文档的原始列表中 运动方案 我的解决方案 跑 预期产量 实际产量 问题是“将索引值列表返回到包含关键字的所有文档的原始列表中” 你只需要考虑字词。 在“Casinoville”一词中,“casino”
- 获取文档列表(每个文档都是字符串)和关键字。 将索引值列表返回到包含关键字的所有文档的原始列表中
在“Casinoville”一词中,“casino”一词不在本例中,因为本例中只有“Casinoville”一词。让我们试着理解其中的区别 “结果”函数可以通过列表理解编写:
def word_search(documents, keyword):
return [i for i, word in enumerate(documents)
if keyword.lower() in
[token.rstrip('.,').lower() for token in word.split()]]
问题发生在索引2
处的字符串:“Casinoville”
请参见输出:
print([token.rstrip('.,').lower() for token in doc_list[2].split()])
# ['casinoville']
问题是:如果列表中有一个单词,你就试着勾选。只有当所有字符串匹配时(这是预期的输出),答案才是True
但是,在您的解决方案中,您只检查单词是否包含子字符串。在这种情况下,中的条件位于字符串
本身,而不是列表
请看:
# On the list :
print('casino' in [token.rstrip('.,').lower() for token in doc_list[2].split()])
# False
# On the string:
print('casino' in [token.rstrip('.,').lower() for token in doc_list[2].split()][0])
# True
因此,在第一种情况下,“Casinoville”
不包括在第二种情况下
希望有帮助 使用
中的操作符时,结果取决于右侧对象的类型。当它是一个列表(或大多数其他类型的容器)时,您将得到一个精确的成员资格测试。因此,['casinoville']
中的'casino'是True
,而['casinoville']
中的'casino'是False
,因为字符串不相等
当的右侧是一个字符串时,它会做一些不同的事情。它不寻找与单个字符的精确匹配(如果您将字符串视为序列,则字符串包含该字符),而是进行子字符串匹配。因此,'casinoville'中的'casino'
是真的
,就像'montecasino'中的赌场
或'foocasinobar'中的'casino'
(检查的不仅仅是前缀)
对于您的问题,您只希望与整个单词完全匹配。参考解决方案使用str.split
分隔单词(在没有参数的情况下,它在任何类型的空格上拆分)。然后它稍微清理单词(去掉标点符号),然后在
中对字符串列表进行匹配
您的代码从不拆分传递的字符串。因此,当您在
测试中执行时,您正在对整个文档进行子字符串匹配,当您匹配较大单词的一部分时,您将得到误报。是的,当然可以,但我想了解的是,在练习解决方案中,规范化的条件if关键字.lower():
返回上一个索引中的false
,如何?因为在我的解决方案中,它返回True
,让我感到困惑。提示:在解释器中键入以下两行:'casinoville'中的'casino'
和['casinoville']
中的'casino'。这两者之间的区别是什么?@glibdud是关于我很困惑为什么在“casinoville”中'casino'
返回True
和在['casinoville']
返回'casino',为什么会发生这种情况?当你试图弄清楚语言功能是如何工作的时候,这总是一个很好的起点。请参阅本节的前两段。很高兴能帮助您!快乐编码:-)
>>> word_search(doc_list, 'casino')
>>> [0]
>>> word_search(doc_list, 'casino')
>>> [0, 2]
def word_search(documents, keyword):
return [i for i, word in enumerate(documents)
if keyword.lower() in
[token.rstrip('.,').lower() for token in word.split()]]
print([token.rstrip('.,').lower() for token in doc_list[2].split()])
# ['casinoville']
# On the list :
print('casino' in [token.rstrip('.,').lower() for token in doc_list[2].split()])
# False
# On the string:
print('casino' in [token.rstrip('.,').lower() for token in doc_list[2].split()][0])
# True