這是我第一次接觸 Python。我正在學習 Head First Python 書中的一個練習。我正在嘗試將一個字串轉換為另一個字串。(將“不要驚慌!”更改為“on tap”。)首先,我將字串轉換為串列。然后,我在 for 回圈中使用 if 陳述句來過濾掉我不需要的字母。
不過,我得到了一些非常奇怪的行為!這是我的代碼:
phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
for character in plist:
if character not in ['o', 'n', 't', 'a', 'p', ' ']:
plist.remove(character)
print("removing ", character)
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)
這是我的輸出:
Don't panic!
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
removing D
removing '
removing i
removing !
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c']
ont panc
為什么字母“c”還在那里?它不在我在 if 陳述句中使用的陣列中,其余字符被過濾掉。但不是“c”。為什么?
uj5u.com熱心網友回復:
為了顯示我在評論中的建議,這是您的代碼,已修改:
phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
removable = []
for character in plist:
if character not in ['o', 'n', 't', 'a', 'p', ' ']:
removable.append(character)
for character in removable:
plist.remove(character)
print("removing ", character)
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)
(實際上,您最好將可移動的設定設為可移除,以消除重復條目,但我將其留作練習。)
uj5u.com熱心網友回復:
為什么會有這種行為?
首先,您要洗掉一個串列,其生成物件在 for 回圈中回圈。使串列動態化。因此,每當您從串列中洗掉索引時,比如說D第 0 個索引,那么[ 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']這將成為您的串列。
現在因為洗掉時的生成器物件D在索引 0 處,那么 next(object) 將指向剩余串列的第一個索引。所以這將是'n有價值的。請注意,它沒有通過o 新更新的索引。當它通過c.
驗證這是一個結果代碼
plist = list(phrase)
print(phrase)
print(plist)
for index, character in enumerate(plist):
print(plist, character, index)
if character not in ['o', 'n', 't', 'a', 'p', ' ']:
plist.remove(character)
# print("removing ", character)
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)
結果
Don't panic!
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] D 0
['o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] n 1
['o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] ' 2
['o', 'n', 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] 3
['o', 'n', 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] p 4
['o', 'n', 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] a 5
['o', 'n', 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] n 6
['o', 'n', 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] i 7
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c', '!'] ! 8
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c']
ont panc
您可以看到洗掉值時串列的行為
uj5u.com熱心網友回復:
您需要遍歷該短語。
phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
for character in phrase:
if character not in ['o', 'n', 't', 'a', 'p', ' ']:
plist.remove(character)
print("removing ", character)
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)
結果
Don't panic!
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
removing D
removing '
removing i
removing !
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c']
ont pan
問題是在您從串列中洗掉一個字符后,例如:'D, i' 我們將跳過下一個字符。您可以測驗是否從 not-in 陣列中洗掉 'o'。應該對輸出沒有影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344550.html
上一篇:嘗試查看一列是否等于另一列
