Python 将数据类型获取为<;班级地图>;而不是int

Python 将数据类型获取为<;班级地图>;而不是int,python,python-3.x,stdin,Python,Python 3.x,Stdin,我对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 并将n和m中的4、3分

我对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

并将n和m中的4、3分别存储为整数数据类型,将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是类映射对象,而不是整数

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

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

Python将在右侧获取一个iterable,并从中获取值并将其分配给左侧的每个变量。这意味着对返回的
map()
对象进行迭代,并使用它生成的每个值进行赋值

您的第二次尝试仅分配给一个变量:

n = map (int, stdin.readline().rstrip().split())
此处不进行iterable解包,因此只分配
map()
对象

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

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

    n = int(stdin.readline())
    
    int()

  • 使用
    next()
    手动迭代:

    注意,我删除了
    .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()
将迭代次数限制在给定的范围内,这是我们阅读的第一行提供的。

感谢您提供的精彩且信息丰富的答案!我显然需要多读一些关于地图的书。
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)))]