4 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
你得到你得到的輸出的原因是
您在循環(huán)遍歷列表時(shí)正在從列表中刪除項(xiàng)目
您正在嘗試使用
list.remove
(僅修改列表并返回None
)的輸出
您最后的列表理解 ( word_list = [word_list.remove(word) for word in word_list if len(word) == 1]
) 本質(zhì)上等同于:
new_word_list = []
for word in word_list:
if len(word) == 1:
new_word_list.append(word_list.remove(word))
word_list = new_word_list
當(dāng)你遍歷它時(shí),會發(fā)生這種情況:
# word_list == ['a', 'apple', 'b', 'banana', 'c', 'cherry']
# new_word_list == []
word = word_list[0] # word == 'a'
new_word_list.append(word_list.remove(word))
# word_list == ['apple', 'b', 'banana', 'c', 'cherry']
# new_word_list == [None]
word = word_list[1] # word == 'b'
new_word_list.append(word_list.remove(word))
# word_list == ['apple', 'banana', 'c', 'cherry']
# new_word_list == [None, None]
word = word_list[2] # word == 'c'
new_word_list.append(word_list.remove(word))
# word_list == ['apple', 'banana', 'cherry']
# new_word_list == [None, None, None]
word_list = new_word_list
# word_list == [None, None, None]
最好的“Pythonic”方式(在我看來)是:
with open('sample.txt') as input_file:
file_content = input_file.read()
word_list = []
for word in file_content.strip().split(' '):
if len(word) == 1:
continue
word_list.append(word.lower())
print(word_list)

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
在您的第一種方法中,您將結(jié)果存儲word_list.remove(word)
在無列表中。Bcz list.remove() 方法只返回對給定列表執(zhí)行的操作。
您的第二種方法是實(shí)現(xiàn)目標(biāo)的 pythonic 方法。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
為什么最初的代碼看起來最合乎邏輯、最有效,卻沒有產(chǎn)生預(yù)期的結(jié)果?
建議不要在遍歷列表時(shí)更改列表。這是因?yàn)樗诘跏剂斜淼囊晥D,并且該視圖將與原始視圖不同。
達(dá)到預(yù)期結(jié)果的最佳“Pythonic”方式是什么?
你的第二次嘗試。但我會使用更好的命名約定,你的理解可以結(jié)合起來,因?yàn)槟阒皇窃诘谝粋€(gè)中將它們設(shè)為小寫:
word_list = input_file.read().strip().split(' ') filtered_word_list = [word.lower() for word in word_list if len(word) > 1]

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
第二次嘗試是最pythonic的。第一個(gè)仍然可以通過以下方式實(shí)現(xiàn):
filename = 'sample.txt'
with open(filename) as input_file:
word_list = input_file.read().strip().split(' ')
word_list = [word.lower() for word in word_list]
for word in word_list:
if len(word) == 1:
word_list.remove(word)
print(word_list)
添加回答
舉報(bào)