Python 3.x如何逐整数读取单行输入并构建数字频率映射?
当然可以实现逐个读取整数来构建频率映射!
完全不用一次性把所有输入加载到内存里——这种逐个处理的方式在应对超大输入时,内存效率会高很多。下面给你几种实用的方法:
方法1:利用标准输入流逐行+逐元素处理
这种方法适用于单行或多行输入,不会一次性加载所有内容到内存:
import sys from itertools import chain frequency = {} # 遍历输入的每一行,拆分后逐个处理数字字符串 for num_str in chain.from_iterable(line.split() for line in sys.stdin): num = int(num_str) # 更新频率字典:存在则+1,不存在则初始化为1 frequency[num] = frequency.get(num, 0) + 1
原理说明:
sys.stdin是一个可迭代对象,每次迭代会读取一行输入,不会一次性把所有输入读入内存。line.split()将每行拆分成字符串形式的数字,chain.from_iterable把这些零散的数字字符串整合成一个连续的迭代器,让我们可以逐个取出处理。- 处理完一个数字字符串后,它就会被垃圾回收,内存里只会保留当前的数字和频率字典,内存占用极低。
方法2:用tokenize模块精准提取整数
如果你的输入里可能混有非整数内容(比如不小心的空格或符号),这个方法能更精准地筛选出整数:
import sys import tokenize frequency = {} # 生成输入的语法token for token in tokenize.generate_tokens(sys.stdin.readline): # 只处理数字类型的token if token.type == tokenize.NUMBER: try: num = int(token.string) frequency[num] = frequency.get(num, 0) + 1 except ValueError: # 跳过无法转成整数的数字(比如浮点数) pass
原理说明:
tokenize.generate_tokens会把输入拆分成Python能识别的语法单元(token),我们只筛选出数字类型的token,再尝试转成整数——这样可以自动过滤掉输入中的无效内容,同时保持逐个处理的低内存特性。
针对单行输入的简化版
如果你的输入确定是单行,也可以用迭代器处理split()的结果(虽然split()会生成列表,但如果行不是特别长,内存压力也很小):
frequency = {} # 迭代拆分后的数字字符串,逐个转换并更新频率 for num_str in input().split(): num = int(num_str) frequency[num] = frequency.get(num, 0) + 1
不过这种方式还是会把整行的所有数字字符串存在列表里,所以如果输入行特别长(比如几十万个数),还是推荐前面两种基于sys.stdin的方法。
内容的提问来源于stack exchange,提问作者user2983071
相关产品推荐
相关产品推荐

