A「;如果范围为“0”,则字符串索引输出;Python错误

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)):

我搜索了其他“字符串索引超出范围”的情况,但它们对我没有用处,所以我想在这里搜索帮助

程序必须这样做:“编写一个函数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)):
         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[]
是的,输出是奇怪和错误的,但这是因为修复此错误意味着,您没有使用
索引器
,而是命中了代码中的其他错误。它不会引起那些错误


接下来,您需要在执行内部循环之后,而不是在执行外部循环之后,返回新的
。否则,您将添加所有剩余的单词,而不仅仅是第一个单词,然后反复添加它们,每个字符添加一次,而不是只添加一次

你可能早就料到了