python - 遍历列表并使用 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']
我的问题是:
- 为什么最初的代码似乎是最合乎逻辑和最有效的却没有产生预期的结果?
- 达到预期结果的最佳“Pythonic”方式是什么?
解决方案
你得到你得到的输出的原因是
- 当您循环浏览列表时,您正在从列表中删除项目
- 您正在尝试使用
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)
推荐阅读
- javascript - 可拖动对象与平面的交点
- codeigniter - 在 CI4 中将配置文件夹移到应用程序之外?
- node.js - 如何使用服务器发送事件(Nodejs - React)将数据(从 POST 路由接收)推送到我的前端
- node.js - 如何从 json 数组中获取唯一记录并相应地放入(club)子记录
- angular - Angular:订阅http put
- android - 适用于 Android 的 App Center 强制更新不起作用
- python - 节点 js 服务器 Python 客户端
- python - AttributeError:“事件”对象没有属性“按钮”
- javascript - 从 Axios 错误响应中删除 Authorization 标头值
- java - 无法使用意图访问外围设备设置