带有islice错误的python itertools

带有islice错误的python itertools,python,Python,我仍在学习python,我有下面的代码,但它不起作用: from itertools import * startword = ["start",] stopword = ["stop",] text = "this is a text that starts with some test stuff and then after that it stop right here!" for i in islice(text.split(" "), startword, stopword):

我仍在学习python,我有下面的代码,但它不起作用:

from itertools import *

startword = ["start",]
stopword = ["stop",]
text = "this is a text that starts with some test stuff and then after that it stop right here!"

for i in islice(text.split(" "), startword, stopword):
    print i
我试着在开始和停止之间打印单词,而不知道中间有多少单词。
从这个错误中,我得到了一个整数作为islice的开始和停止参数。下面是错误“
ValueError:islice()的索引必须为None或整数:0您需要计算'start'和'stop'的索引,然后提供
两个整数值,而不是字符串:

for i in islice(text.split(" "), startword_index, stopword_index):
    print i

在这种特殊情况下,
islice
是一个糟糕的选择;内存中的所有数据都是按已实现的顺序存储的,因此
islice
只是浪费时间迭代前导值。有很多更好的方法来处理这个问题,可以使用
index
找到
开始
结束
索引并执行一个真正的操作切片,或者更聪明,通过拆分
开始/结束
分隔的部分并仅拆分该部分以提取单词来减少工作量。例如:

text = "this is a text that starts with some test stuff and then after that it stop right here!"

_, text = text.split('start', 1)  # Remove start and stuff before it
text, _ = text.rsplit('stop', 1)  # Remove stop and stuff after it

for word in text.split():  # Split what remains on whitespace
    print word

请注意,这仍然不太正确(您的边界区域以“开始”而不是“开始”开头,因此您以“s”开头的“单词”结束),但切换到
re。使用适当的边界和通配符拆分
,可以用任何适合您的场景的方式来解决此问题。

谢谢您,请原谅我的无知。当您说index时,您是指起始词index和text[15]的文本[5]意义吗?是的,有许多不同的方法可以解决这些问题。不客气。请注意,如果您知道索引,您可以只进行切片;
islice
跳过许多值是低效的,如果数据已经在内存中,它必须迭代到起始点,并且在高效地执行时,如果它已经是一个
列表,真正的切片可以完全跳过。切片使用索引,而不是值。您可以使用
.index()
方法获取该值的标识,但您将需要:存储
text.split(“”)的返回值
在将其传递到islice中使用之前。正确索引和B:使用表示开始的正确单词,
“开始”
不出现在您的句子中,而是
“开始”“
是谁干的。非常感谢@tadhgmdonald Jensen我需要吃和你吃的一样的食物才能像你一样聪明:))真正的python切片操作将保留在起始值中,也可能使用不同的变量名,因此原始文本仍然可用。除此之外,我喜欢这个解决方案。谢谢@ShadowRanger这是一个完美的解释。如果我的起始词不仅仅是“start”,比如“starts with”@tadhgcdonald Jensen:Yar,那么替换变量以保留原始字符串并不是一个坏主意。我避免保留
start
,只是因为我觉得它比要保留的部分数据更接近分隔符,但这显然取决于问题。@FrankBud:您可以将第一个
split
参数更改为任何您喜欢的参数,它将被删除,之前的所有参数也将被删除。如果它更复杂(任何以
start
开头的单词,但可能有尾随的附加字符),那么最好使用类似
r'\bstart\w*\b'
的模式移动到
re.split