使用sys.stdin.readlines()读取数据时如何去除行尾\n且不降低读取速度
如何在保留
sys.stdin.readlines()的前提下高效去除行尾的\n? 我使用sys.stdin.readlines()读取输入数据,但输出结果里的字符串保留了行尾的\n。需要在不降低读取速度、保持数字为字符串格式且必须保留sys.stdin.readlines()写法的前提下,去除这些换行符。
原代码
import sys data = sys.stdin.readlines() id = 0 while id < len(data) - 1: n = int(data[id]) id += 1 some_list = [] for _ in range(n): x1, y1, x2, y2 = map(str, data[id].split(" ")) some_list.append([x1, y1, x2, y2]) id += 1 print(some_list)
输入示例
2 0 3 1 2 2 1 3 1 4 3 1 1 0 0 0 2 1 1 1 2 0 3 0 3 1
原输出(含\n)
[['0', '3', '1', '2\n'], ['2', '1', '3', '1\n']] [['3', '1', '1', '0\n'], ['0', '0', '2', '1\n'], ['1', '1', '2', '0\n'], ['3', '0', '3', '1']]
解决方案:读取时批量去除\n
最高效的方式是在生成data列表时,用**列表推导式+rstrip('\n')**一次性处理所有行,既不损失读取速度,又精准去除行尾换行符:
修改后的完整代码
import sys # 读取时直接去除每行末尾的\n,不影响其他空格 data = [line.rstrip('\n') for line in sys.stdin.readlines()] id = 0 # 修正原代码的边界bug:原len(data)-1会跳过最后一行有效数据 while id < len(data): n = int(data[id]) id += 1 some_list = [] for _ in range(n): # 使用split()默认按任意空白分割,比split(" ")更健壮(兼容多空格/制表符) x1, y1, x2, y2 = data[id].split() some_list.append([x1, y1, x2, y2]) id += 1 print(some_list)
关键说明
- 效率保障:列表推导式是Python中性能最优的迭代方式之一,
rstrip('\n')仅针对字符串末尾的换行符做截断操作,不会遍历整个字符串,与原生readlines()相比几乎无性能损耗。 - 格式保留:仅去除行尾的
\n,不改变数字的字符串格式,也不会影响行内的空格分隔。 - bug修复:原代码的
while id < len(data) - 1会遗漏最后一行有效数据,改为while id < len(data)即可覆盖所有输入行。
修改后的输出(无\n)
[['0', '3', '1', '2'], ['2', '1', '3', '1']] [['3', '1', '1', '0'], ['0', '0', '2', '1'], ['1', '1', '2', '0'], ['3', '0', '3', '1']]
内容的提问来源于stack exchange,提问作者niico
相关产品推荐
相关产品推荐

