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

Getting data type as <class Map> instead of int

我对 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 是一个 class 映射对象,而不是整数。

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

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

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() 将迭代限制为给定的数字,此处从我们阅读的第一行开始提供。