You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:29:35