4 回答
TA贡献1852条经验 获得超1个赞
你得到你得到的输出的原因是
您在循环遍历列表时正在从列表中删除项目
您正在尝试使用
list.remove
(仅修改列表并返回None
)的输出
您最后的列表理解 ( word_list = [word_list.remove(word) for word in word_list if len(word) == 1]
) 本质上等同于:
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
当你遍历它时,会发生这种情况:
# 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贡献1860条经验 获得超9个赞
在您的第一种方法中,您将结果存储word_list.remove(word)
在无列表中。Bcz list.remove() 方法只返回对给定列表执行的操作。
您的第二种方法是实现目标的 pythonic 方法。
TA贡献1797条经验 获得超6个赞
为什么最初的代码看起来最合乎逻辑、最有效,却没有产生预期的结果?
建议不要在遍历列表时更改列表。这是因为它正在迭代初始列表的视图,并且该视图将与原始视图不同。
达到预期结果的最佳“Pythonic”方式是什么?
你的第二次尝试。但我会使用更好的命名约定,你的理解可以结合起来,因为你只是在第一个中将它们设为小写:
word_list = input_file.read().strip().split(' ') filtered_word_list = [word.lower() for word in word_list if len(word) > 1]
TA贡献1829条经验 获得超7个赞
第二次尝试是最pythonic的。第一个仍然可以通过以下方式实现:
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)
添加回答
举报