“string index out if range”Python

2024-09-27 04:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

程序必须这样做:“编写一个函数kth_word(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))

(我尽力以正确的方式实现代码,但我不知道如何实现)

取决于你住的地方return new它给出了一个错误或者一个空答案


Tags: andtheto字符串代码newlenif
3条回答

Warning: do not use the split string method.

因此groupby/islice中的itertools应该可以工作:

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'

我们通过将StopIteration中的可选参数设置为''来处理StopIteration错误。在

不允许使用str.split。如果可以的话,答案就是:

def kth_word(s, k):
    return s.split()[k]

但是如果你能写一个函数来做str.split所做的事情,你可以改为调用它。当然,这也说明您理解了任务测试的所有内容,如何在字符串上循环,执行逐字符操作,等等。在

您可以编写一个只包含Python特性的版本,这些特性通常在第一周就已经教授过了:

^{pr2}$

如果您了解其他Python功能,可以通过以下几种方式改进:

  • current构建为list,而不是str和{}。在
  • 将那些append调用改为yield,这样它就可以懒洋洋地拆分字符串(甚至比str.split更好)。在
  • 使用str.findstr.indexre.search查找下一个空格,而不是逐个字符搜索。在
  • 将空间查找部分抽象到一个通用生成器中,或者,一旦您意识到您想要的,就可以在itertools中找到该函数。在
  • 添加我们在str.split中缺少的所有功能,例如传递自定义分隔符而不是打断任何空白的功能。在

但我认为即使是基本版本,假设你理解它并能解释它的工作原理,也足以让你的作业得个A。在

而且,更重要的是,你在练习解决问题的最佳方法:把它们简化成更简单的问题。split实际上比kth_word更容易写,但是一旦你写了splitkth_word就变得微不足道了。在

在第一个for循环中,从0迭代到len(s)-1,但是您正在寻址{},在最后一次迭代中,它是len(s)。在

s[len(s)]是一个索引器——它超出了界限。在


另外,您的while循环将被关闭一个。在

while i!= " " and i<=len(s):
    # do something referencing s[i]

你的第一个条件没有意义(i是一个数字,怎么可能是" "?)你的第二个错误与上述相同,其中i最大值为len(s),而{}是一个错误。在


您的逻辑在这里也有点偏离,因为您将它包装在for循环中,该循环已经在引用i。这看起来是一个takewhile循环,但实际上并不是这样。在

相关问题 更多 >

    热门问题