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