A「;如果范围为“0”,则字符串索引输出;Python错误
我搜索了其他“字符串索引超出范围”的情况,但它们对我没有用处,所以我想在这里搜索帮助 程序必须这样做:“编写一个函数kth_字(s,k),给定一个字符串s和一个整数k≥ 1返回字符串s中的第k个单词。如果s的单词少于k个,则返回空字符串。我们假定s的所有字符都是字母和空格。警告:不要使用拆分字符串方法。” 这是我的密码:A「;如果范围为“0”,则字符串索引输出;Python错误,python,string,indexing,range,Python,String,Indexing,Range,我搜索了其他“字符串索引超出范围”的情况,但它们对我没有用处,所以我想在这里搜索帮助 程序必须这样做:“编写一个函数kth_字(s,k),给定一个字符串s和一个整数k≥ 1返回字符串s中的第k个单词。如果s的单词少于k个,则返回空字符串。我们假定s的所有字符都是字母和空格。警告:不要使用拆分字符串方法。” 这是我的密码: def kth_word(s, k): new ="" word_count = 0 for i in range(0, len(s)):
def kth_word(s, k):
new =""
word_count = 0
for i in range(0, len(s)):
if s[i] == " " and s[i+1] != " ":
word_count+=1
#try to find how many characters to print until the space
if word_count == k-1:
while i!= " " and i<=len(s): #if it is changed to i<len(s), the output is strange and wrong
new+=s[i]
i=i+1
print(new) #check how new is doing, normally works good
return new
print(kth_word('Alea iacta est', 2))
def kth_单词(s,k):
new=“”
字数=0
对于范围(0,len(s))内的i:
如果s[i]==“”和s[i+1]!=" ":
字数+=1
#试着找出要打印多少字符直到空格
如果单词计数=k-1:
而我“”在第一个for
循环中,我您从0
迭代到len(s)-1
,但您正在寻址i+1
,在最后一次迭代中,它是len(s)
s[len(s)]
是一个索引器——它超出了范围
此外,您的while
循环将关闭一次
while i!= " " and i<=len(s):
# do something referencing s[i]
而我!=“”在第一个for
循环中,我您从0
迭代到len(s)-1
,但您正在寻址i+1
,在最后一次迭代中,它是len(s)
s[len(s)]
是一个索引器——它超出了范围
此外,您的while
循环将关闭一次
while i!= " " and i<=len(s):
# do something referencing s[i]
而我!=”“我呢
警告:不要使用分割字符串方法
因此,itertools
中的groupby
/islice
应该可以工作:
from itertools import groupby, islice
def kth_word(s, k):
g = (j for i, j in groupby(s, key=lambda x: x==' ') if not i)
return ''.join(next(islice(g, k-1, k), ''))
words = 'Alea iacta est'
res = kth_word(words, 2) # 'est'
我们通过将next
中的可选参数设置为'
来处理StopIteration
错误
警告:不要使用分割字符串方法
因此,itertools
中的groupby
/islice
应该可以工作:
from itertools import groupby, islice
def kth_word(s, k):
g = (j for i, j in groupby(s, key=lambda x: x==' ') if not i)
return ''.join(next(islice(g, k-1, k), ''))
words = 'Alea iacta est'
res = kth_word(words, 2) # 'est'
我们通过将next
中的可选参数设置为'
来处理StopIteration
错误。实际上,这里至少有五个问题,需要解决所有问题
首先,正如作者所指出的,这是错误的:
for i in range(0, len(s)):
if s[i] == " " and s[i+1] != " ":
while i!= " " and i<=len(s):
new+=s[i[]
这将使用i
循环所有小于等于len(s)
的值,这很好,但如果s[i]
是一个空格,它将尝试访问s[i+1]
。因此,如果字符串以空格结尾,您将在此处得到一个索引器
其次,正如戈伦在评论中指出的,这是错误的:
for i in range(0, len(s)):
if s[i] == " " and s[i+1] != " ":
while i!= " " and i<=len(s):
new+=s[i[]
是的,输出是奇怪和错误的,但这是因为修复此错误意味着,您没有使用索引器
,而是命中了代码中的其他错误。它不会引起那些错误
接下来,您需要在执行内部循环之后,而不是在执行外部循环之后,返回新的。否则,您将添加所有剩余的单词,而不仅仅是第一个单词,然后反复添加它们,每个字符添加一次,而不是只添加一次
您可能期望这样做会影响循环变量并跳过单词的其余部分,但(a)不会;下一次通过for
时,它只是将i
重新分配到下一个值,并且(b)无论如何都不会有帮助,因为您只是将i
前进到下一个空格,而不是字符串的末尾
另外,你在这个空间计算单词,然后你从那个空间迭代到下一个空间。这意味着(除了第一个单词)你要把空格作为单词的一部分。因此,您需要在while
循环之前执行i+=1
虽然不尝试重用同一变量i
,也不尝试使用for
而不是while
可能更具可读性
此外,您的内部循环应该检查s[i]!=“
,而不是i!”=“”
。显然,索引作为一个数字,永远不会等于一个空格字符
如果没有以前的修复,这意味着您将输出iacta est
在它前面有一个额外的空间,但在以前的修复中,这意味着您没有输出任何内容,而不是iacta
一旦您解决了所有这些问题,您的代码就会正常工作:
def kth_word(s, k):
word_count = 0
for i in range(0, len(s) - 1):
if s[i] == " " and s[i+1] != " ":
word_count+=1
#try to find how many characters to print until the space
if word_count == k-1:
new =""
j = i+1
while j < len(s) and s[j] != " ":
new+=s[j]
j = j+1
print(new) #check how new is doing, normally works good
return new
def kth_单词(s,k):
字数=0
对于范围(0,透镜-1)内的i:
如果s[i]==“”和s[i+1]!=" ":
字数+=1
#试着找出要打印多少字符直到空格
如果单词计数=k-1:
new=“”
j=i+1
而j
好吧,你对第一个单词仍然有问题,但我会让你去发现并解决它。你实际上至少有五个问题,你需要解决所有问题
首先,正如作者所指出的,这是错误的:
for i in range(0, len(s)):
if s[i] == " " and s[i+1] != " ":
while i!= " " and i<=len(s):
new+=s[i[]
这将使用i
循环所有小于等于len(s)
的值,这很好,但如果s[i]
是一个空格,它将尝试访问s[i+1]
。因此,如果字符串以空格结尾,您将在此处得到一个索引器
其次,正如戈伦在评论中指出的,这是错误的:
for i in range(0, len(s)):
if s[i] == " " and s[i+1] != " ":
while i!= " " and i<=len(s):
new+=s[i[]
是的,输出是奇怪和错误的,但这是因为修复此错误意味着,您没有使用索引器
,而是命中了代码中的其他错误。它不会引起那些错误
接下来,您需要在执行内部循环之后,而不是在执行外部循环之后,返回新的。否则,您将添加所有剩余的单词,而不仅仅是第一个单词,然后反复添加它们,每个字符添加一次,而不是只添加一次
你可能早就料到了