我是python的新手,已经阅读了我在for循环和del运算符上可以找到的内容,但我仍然不明白为什么我对下面问题的解决方案无效:
问题
给定一个字符串,返回一个由第一个字符串开头的新字符串,因此"Hello"
会产生"Hlo"
。
string_bits('Hello') → 'Hlo'
string_bits('Hi') → 'H'
string_bits('Heeololeo') → 'Hello'
解
def string_bits(str):
for i in range(len(str)):
if i % 2 != 0:
del[i]
return str
这只返回原始字符串的副本并且不删除任何内容 - 为什么不删除该范围内的奇数?
答案 0 :(得分:4)
字符串是不可变的,这意味着你不能只删除任意字符。
要解决您的问题,我会使用切片表示法
x = 'Heeololeo'
y = x[::2]
print(y) # Hello
您可以找到详细信息here。
答案 1 :(得分:1)
你不应该改变你正在迭代的东西。您应该提取所需的数据并将其保存到新变量并返回该变量。
答案 2 :(得分:1)
首先,字符串是不可变的。其次,你不应该在迭代迭代时修改迭代。
制作副本,或使用过滤器:
new_string = ''.join(c for i, c in enumerate(old_string) if i%2 != 0)
简化版:
result = []
for i, c in enumerate(old_string):
if i%2 != 0:
result.append(c)
new_string = ''.join(result)
更简单,更酷的方法是使用extended slice notation:
制作切片new_string = old_string[::2]
另外,避免使用像str
这样的名称,你会影响有用的内置函数。
答案 3 :(得分:1)
字符串是immutable
,这意味着一旦创建它们就无法更改它们。所有似乎“改变”字符串的函数实际上都会返回字符串的新版本。
无论如何,一个好的经验法则是不要改变你正在迭代的东西。您可以使用列表推导来创建仅包含所需字符的新字符串。