我对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对象。如何修复代码并获得预期的输入?
答案 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()
将迭代限制为给定的数字,此处从我们读取的第一行开始。