2014-01-09 68 views
0

我很新的python,並閱讀了我可以找到的循環和del運算符,但我仍然不明白爲什麼我對下面的問題的解決方案是'牛逼的工作:python del運算符不工作在我的for循環

問題

給定一個字符串,返回由開始的第一所有其他字符的一個新的字符串,所以"Hello"產生"Hlo"

string_bits('Hello') → 'Hlo' 
string_bits('Hi') → 'H' 
string_bits('Heeololeo') → 'Hello' 

SOLUTION

def string_bits(str): 
    for i in range(len(str)): 
     if i % 2 != 0: 
     del[i] 
    return str 

這只是返回原始字符串的一個副本,不會刪除任何東西 - 爲什麼不在範圍奇數被刪除?

+0

注意:即使可能,del [i]'不會是正確的語法;你正在刪除名稱'i',而不是序列'str'的​​一部分。另外,不要命名一個變量'str'。 – geoffspear

回答

1

你不應該改變你正在迭代的東西。你應該提取你需要的數據並保存到一個新的變量並返回。

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這樣的名稱,內置功能。

1

Python中的字符串是immutable,這意味着一旦它們被創建,它們就不能被更改。所有似乎「改變」字符串的函數實際上都會返回字符串的新版本。

無論如何,一個好的經驗法則是不要改變你正在迭代的東西。你可以使用列表理解來創建一個只有你想要的字符的新字符串。

4

字符串是不可變的,這意味着你不能只刪除任意字符。

解決你的問題,我會用切片標誌

x = 'Heeololeo' 

y = x[::2] 

print(y) # Hello 

你可以找到的細節here