【问题标题】:Getting data type as <class Map> instead of int获取数据类型为 <class Map> 而不是 int
【发布时间】:2016-02-09 18:33:18
【问题描述】:

我对 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 python-3.x stdin


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供的精彩而翔实的回答!我显然需要阅读更多有关地图的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2012-08-06
    • 2015-03-10
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多