带有islice错误的python itertools
我仍在学习python,我有下面的代码,但它不起作用:带有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):
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
。