Error:string index out of range, defining a function
Error:string index out of range, defining a function
我正在 codingbat.com 练习编码,因为我是 python 的完全初学者,这里是练习之一:
给定一个字符串,return 一个新字符串由第一个字符开始的所有其他字符组成,因此 "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)
运行 代码报错。我的代码有什么问题?
问题是 char += 2 returns 一个大于 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 的保留字。
您收到的错误意味着您正在尝试获取少于 n 个字符的字符串的第 n 个字母。
作为另一个建议,字符串是 Python 中的序列类型,这意味着它们具有许多内置功能,可以准确地完成您在这里想要做的事情。有关更多信息,请参阅 Built-in Types - Python,但要知道序列类型支持切片 - 即从序列中选择元素。
因此,您可以像这样对字符串进行切片:
def string_bits(input_string):
return input_string[::2]
含义"take my input_string from the start (:) to the end (:) and select every second (2) element"
另一种方法,并附有解释:
如果您需要处理包含 spaces 的句子,您可以使用切片来完成此操作。在字符串切片上工作为:
[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
使它成为一个列表。默认情况下拆分将拆分 space,因此我们将有:
["Hello", "World"]
然后,我们将从那里做的是使用推导式,遍历列表中的每个项目,一次给我们一个单词,然后我们将根据 [= 执行所需的字符串操作17=].
理解为:(documentation)
i[::2] for i in "Hello World".split()
最后,我们调用 "".join
(doc),这会将我们的列表变回字符串,最终为我们提供输出:
"Hlo Wrd"
查看文档中的切片部分:https://docs.python.org/3/tutorial/introduction.html
好的,对我来说:
- 您不应将 str 用作变量名,因为它是 python 内置函数(例如,将 str 替换为 my_str)
- 例如,'Hello' 长度为 5,因此 0 <= 索引 <= 4。此处您尝试在 for 循环中访问索引 3+2=5(当 char = 3 时)。
你可以用下面的代码实现你想要的:
def string_bits(my_str):
result = ""
for char in range(0, len(my_str), 2):
result += my_str[char]
return result
我正在 codingbat.com 练习编码,因为我是 python 的完全初学者,这里是练习之一:
给定一个字符串,return 一个新字符串由第一个字符开始的所有其他字符组成,因此 "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)
运行 代码报错。我的代码有什么问题?
问题是 char += 2 returns 一个大于 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 的保留字。
您收到的错误意味着您正在尝试获取少于 n 个字符的字符串的第 n 个字母。
作为另一个建议,字符串是 Python 中的序列类型,这意味着它们具有许多内置功能,可以准确地完成您在这里想要做的事情。有关更多信息,请参阅 Built-in Types - Python,但要知道序列类型支持切片 - 即从序列中选择元素。
因此,您可以像这样对字符串进行切片:
def string_bits(input_string):
return input_string[::2]
含义"take my input_string from the start (:) to the end (:) and select every second (2) element"
另一种方法,并附有解释:
如果您需要处理包含 spaces 的句子,您可以使用切片来完成此操作。在字符串切片上工作为:
[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
使它成为一个列表。默认情况下拆分将拆分 space,因此我们将有:
["Hello", "World"]
然后,我们将从那里做的是使用推导式,遍历列表中的每个项目,一次给我们一个单词,然后我们将根据 [= 执行所需的字符串操作17=].
理解为:(documentation)
i[::2] for i in "Hello World".split()
最后,我们调用 "".join
(doc),这会将我们的列表变回字符串,最终为我们提供输出:
"Hlo Wrd"
查看文档中的切片部分:https://docs.python.org/3/tutorial/introduction.html
好的,对我来说:
- 您不应将 str 用作变量名,因为它是 python 内置函数(例如,将 str 替换为 my_str)
- 例如,'Hello' 长度为 5,因此 0 <= 索引 <= 4。此处您尝试在 for 循环中访问索引 3+2=5(当 char = 3 时)。
你可以用下面的代码实现你想要的:
def string_bits(my_str):
result = ""
for char in range(0, len(my_str), 2):
result += my_str[char]
return result