Python del运算符不在我的for循环中工作

时间:2014-01-09 16:10:01

标签: python

我是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

这只返回原始字符串的副本并且不删除任何内容 - 为什么不删除该范围内的奇数?

4 个答案:

答案 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)

Python中的

字符串是immutable,这意味着一旦创建它们就无法更改它们。所有似乎“改变”字符串的函数实际上都会返回字符串的新版本。

无论如何,一个好的经验法则是不要改变你正在迭代的东西。您可以使用列表推导来创建仅包含所需字符的新字符串。