获取数据类型为<class map =“”>而不是int

时间:2016-02-09 18:33:18

标签: 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分别作为整数数据类型存储,并将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对象。如何修复代码并获得预期的输入?

1 个答案:

答案 0 :(得分:0)

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