【发布时间】:2020-07-14 02:42:05
【问题描述】:
我是一名编程新手,希望得到一些帮助以了解为什么以下算法会以特定方式运行。
我的目标是让函数读取包含单词(可以大写)的文本文件,去除空格,将项目拆分为单独的行,将所有大写的第一个字符转换为小写,删除所有单个字符(例如,“ a”、“b”、“c”等),并将生成的单词添加到列表中。所有单词都将成为列表中的单独项目以供进一步处理。
输入文件: 一个文本文件('sample.txt')包含以下数据 - “a apple b Banana c 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)
产生的非期望输出 = [None, None, None]
我的下一个尝试是遍历单词列表以测试它们的长度是否大于 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']
我的问题是:
- 为什么最初的代码没有产生预期的结果,而它似乎是最合乎逻辑和最有效的?
- 实现预期结果的最佳“Pythonic”方式是什么?
【问题讨论】:
-
你不应该在循环遍历列表时修改它。
-
list.remove修改列表,但它不返回任何内容(它返回None) -
FWIW,在我多年的 python 中,我从未使用过
list.remove... 但是初学者尝试使用它似乎很常见!