错误:字符串索引超出范围,定义一个函数

时间:2016-02-28 23:46:56

标签: python python-3.5

我正在编写codingbat.com上的编码,因为我是python的初学者,这是练习之一:

给定一个字符串,返回一个由第一个字符串组成的新字符串,所以“Hello”产生“Hlo”。

这是我尝试定义函数string_bits(str):

def string_bits(str):
  char = 0
  first = str[char]
  for char in range(len(str)):
    char += 2
    every_other = str[char]
return (first + every_other)

运行代码会出错。我的代码出了什么问题?

5 个答案:

答案 0 :(得分:2)

一种不同的方法,并附有解释:

如果您需要处理一个句子,其中包含空格,您可以使用切片来完成此操作。字符串切片的工作原理如下:

[start_of_string:end_of_string:jump_this_many_char_in_string]

所以,你想只跳每两个字母,所以你这样做:

[::2]

前两个是空的,因为你只想步进每一个字符。

所以,您可以在一行中执行此操作,如下所示:

>>> " ".join(i[::2] for i in "Hello World".split())
'Hlo Wrd'

上面发生的事情是,我们接受我们的字符串,使用split将其作为列表。默认情况下,拆分将拆分为空格,因此我们将:

["Hello", "World"]

然后,我们将从那里做的是使用理解,遍历列表中的每个项目,这将一次给我们一个单词,并从那里我们将执行所需的字符串操作{{1} }。

理解是:(documentation

i[::2]

最后,我们调用i[::2] for i in "Hello World".split() doc),它现在将我们的列表更改回字符串,最后给我们输出:

"".join

查看文档中的切片部分:https://docs.python.org/3/tutorial/introduction.html

答案 1 :(得分:1)

问题是char + = 2返回的值大于len(str),因为len(str)-1(范围)+ 2比字符串长。你可以这样做:

def string_bits(string):

    if len(string) == 2:
        return string[0]

    result = ''
    for char in range(0,len(string),2):#range created value sin increments of two
        result += string[char]
    return result

更简洁的方法是:

def string_bits(string):
    return string[::2]

你应该避免使用'str'作为变量名,因为它是Python的保留字。

答案 2 :(得分:1)

好的,对我来说:

  1. 你不应该使用str作为变量名,因为它是一个python内置函数(例如用my_str替换str)
  2. 例如,'您好' length是5,所以0< = index< = 4.这里你试图在for循环中访问索引3 + 2 = 5(当char = 3时)。
  3. 您可以使用以下代码实现所需目的:

    def string_bits(my_str):
      result = ""
      for char in range(0, len(my_str), 2):
        result += my_str[char]
      return result
    

答案 3 :(得分:0)

您获得的错误意味着您正在尝试获取少于n个字符的字符串的第n个字母。

答案 4 :(得分:0)

作为另一个建议,字符串是Python中的序列类型,这意味着它们具有许多内置功能,可以完全按照您在此处尝试的内容进行操作。有关更多信息,请参阅Built-in Types - Python,但要知道序列类型支持切片 - 即从序列中选择元素。

所以,你可以像这样切割你的字符串:

def string_bits(input_string):
    return input_string[::2]

含义"从start(:)到end(:)取我的input_string并选择每秒(2)元素"