首页 > 解决方案 > 遍历列表并使用 remove() 不会产生所需的结果

问题描述

我是一名编程新手,在理解以下算法为何以特定方式运行时需要一些帮助。

我的目标是让函数读取包含单词(可以大写)的文本文件,去除空格,将项目拆分为单独的行,将所有大写的第一个字符转换为小写,删除所有单个字符(例如,“a”, “b”、“c”等),并将结果单词添加到列表中。所有单词都将成为列表中的单独项目以供进一步处理。

输入文件:一个文本文件('sample.txt')包含以下数据 - “a apple b Banana c cherry”</p>

期望的输出:['apple', 'banana', 'cherry']

在我最初的尝试中,我尝试遍历单词列表以测试它们的长度是否等于 1。如果是,则将从列表中删除该单词,而其他单词保留在列表中。这导致了以下非预期输出:[None, None, None]

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]
    word_list = [word_list.remove(word) for word in word_list if len(word) == 1]

print(word_list)

产生的非期望输出 = [无,无,无]

我的下一个尝试是遍历单词列表以测试它们的长度是否大于 1。如果是,则将该单词添加到列表中(将单个字符留在后面)。使用这种方法实现了所需的输出。

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]
    word_list = [word for word in word_list if len(word) > 1]

print(word_list)

产生所需的输出 = ['apple', 'banana', 'cherry']

我的问题是:

  1. 为什么最初的代码似乎是最合乎逻辑和最有效的却没有产生预期的结果?
  2. 达到预期结果的最佳“Pythonic”方式是什么?

标签: pythonlistiteration

解决方案


你得到你得到的输出的原因是

  1. 当您循环浏览列表时,您正在从列表中删除项目
  2. 您正在尝试使用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)

推荐阅读