Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 对弦的怀疑_Python 3.x_String - Fatal编程技术网

Python 3.x 对弦的怀疑

Python 3.x 对弦的怀疑,python-3.x,string,Python 3.x,String,所以,我正在用python做一个练习,我试图用终端一步一步地理解发生了什么,但我没有 我主要想了解为什么条件返回只返回索引0。 在[Casinoville].lower()中查看“casino”不是一回事吗 练习: 获取文档列表(每个文档都是字符串)和关键字。 将索引值列表返回到包含关键字的所有文档的原始列表中 运动方案 我的解决方案 跑 预期产量 实际产量 问题是“将索引值列表返回到包含关键字的所有文档的原始列表中” 你只需要考虑字词。 在“Casinoville”一词中,“casino”

所以,我正在用python做一个练习,我试图用终端一步一步地理解发生了什么,但我没有

我主要想了解为什么条件返回只返回索引0。 在[Casinoville].lower()中查看“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