当以下代码没有达到我预期的效果时,我感到震惊:
lines_list = ['this is line 1\n', 'this is line 2\n', 'this is line 3\n']
for line in lines_list:
line = line.strip()
Run Code Online (Sandbox Code Playgroud)
在Perl或Java中,我的用法效果很好。Python 是具有独特行为的Python。
在 Java 中,这将起作用:
lines_list = ['this is line 1\n', 'this is line 2\n', 'this is line 3\n']
for line in lines_list:
line = line.strip()
Run Code Online (Sandbox Code Playgroud)
在 Perl 中,这将起作用:
String[] lines = {"this is line 1\n", "this is line 2\n", "this is line 3\n"};
for (String line : lines) {
line = line.trim();
}
Run Code Online (Sandbox Code Playgroud)
我当然希望列表中的每个项目都成为"stripped",即在这种情况下,没有尾随'\n'字符,但它没有......
print lines_list
Run Code Online (Sandbox Code Playgroud)
输出:
['this is line 1\n', 'this is line 2\n', 'this is line 3\n']
Run Code Online (Sandbox Code Playgroud)
有没有一种优雅的方法可以在循环期间更改列表项for?我不想重复这个列表...
您最初关于 python 独特性的说法是不正确的。如果运行 Java 代码然后打印内容,lines您将看到该数组包含原始未剥离的字符串,其原因与 python 相同。
您可以按索引浏览并以这种方式就地修改
for i, _ in enumerate(lines_list):
lines_list[i] = lines_list[i].strip()
Run Code Online (Sandbox Code Playgroud)
虽然我认为如果列表不是太大而导致问题,很多人会更喜欢复制列表的简单性
lines_list = [line.strip() for line in lines_list]
Run Code Online (Sandbox Code Playgroud)
问题是使用=运算符重新分配给变量line,它不会做任何事情来影响原始字符串的内容。新的 Python 程序员在以下情况下同样会感到惊讶:
for i in range(10):
print(i)
i += 1
Run Code Online (Sandbox Code Playgroud)
打印数字 0,1,2,3,4,5,6,7,8,9。发生这种情况是因为 for 循环i在每次迭代开始时重新分配给范围中的下一个元素。这不完全是你的问题,但很相似。
由于您正在从文件中读取行,然后将其剥离,所以您真正应该做的是
with open(file_name) as f:
lines_list = [line.strip() for line in f]
Run Code Online (Sandbox Code Playgroud)
一次读取并剥离一行,而不是先读取所有内容,然后再剥离行
| 归档时间: |
|
| 查看次数: |
2127 次 |
| 最近记录: |