Skip to main content
 首页 » 编程设计

python之获取数据类型为 class Map> 而不是 int

2025年05月04日26shangdawei

我是 Python 的新手,一直在尝试解决 HackerRank 上的一些竞争性编程问题。为了接收输入,我必须从“stdin”获取它,因此我在一个问题中成功地使用了它:

... 
n,m = map (int, stdin.readline().rstrip().split()) 
coins=[] 
 
coins=[int(n) for n in stdin.readline().rstrip().split()] 
... 

这将接受输入:

4 3

1 2 3

并将4、3分别作为整数数据类型存储在n和m中,将1、2、3存储在列表中。

但是在一个新程序中,我尝试了以下操作:

from sys import stdin,stdout 
 
n = map (int, stdin.readline().rstrip().split()) 
arr=[] 
 
for i in range (n): 
    x= map(int, stdin.readline().rstrip().split()) 
    arr.append(x) 

目的是从第一行取一个整数n,然后读取包含一个整数的后续n行,并将这些整数存储在一个名为arr的列表中。 这会引发一个运行时错误,表明 n 是一个类映射对象,而不是整数。

我尝试在这两种情况下都使用 type(n),第一个返回 int,第二个返回 map 对象。如何修复我的代码并获得预期的输入?

请您参考如下方法:

在 Python 3 中,map() 返回一个可迭代对象。您的第一次尝试将输出分配给两个变量:

n,m = map (int, stdin.readline().rstrip().split()) 

Python 将在右侧获取一个可迭代对象,并从中获取值并将其分配给左侧的每个变量。这意味着返回的 map() 对象被迭代,并且它产生的每个值都用于分配。

你的第二次尝试只分配给一个变量:

n = map (int, stdin.readline().rstrip().split()) 

这里没有发生可迭代的拆包,所以只分配了 map() 对象。

您有三种选择来避免您的问题:

  • 不使用map(),直接转为整数即可。既不需要拆分也不需要剥离,毕竟只有一个数字:

    n = int(stdin.readline()) 
    

    int() 不太关心开头或结尾的空格,所以这里不需要剥离。

  • 使用 next() 手动迭代:

    n = next(map (int, stdin.readline().split())) 
    

    请注意,我删除了 .rstrip(); str.split() 还负责忽略字符串开头和结尾的空格。

  • 通过添加逗号使其成为可迭代的赋值:

    n, = map (int, stdin.readline().split()) 
    

你可以使用一些可迭代的魔法在一行中读取所有这些整数:

from sys import stdin, stdout 
from itertools import islice 
 
arr = [int(l) for l in islice(stdin, int(next(stdin)))] 

stdin 是一个文件对象,和所有文件对象一样,支持迭代。每次迭代时,您都会得到一行。 islice() 将迭代限制为给定的数字,此处从我们阅读的第一行开始提供。