[英]Python - store a string and an int using map(sys.stdin.readline())
如果输入包含空格分隔的int行,则 -
1 3
我可以使用map()
函数将它存储在一个数组中
arr = map(int,sys.stdin.readline().split())
或者甚至在两个单独的变量中
n,m = map(int,sys.stdin.readline().split())
有没有办法使用相同的方法来读取包含混合数据类型的输入行。 例如。-
foo 3
其中foo
是一个字符串, 3
是一个整数?
要做到这一点,你应该能够区分可以表示整数的字符串和不能表示整数的字符串。 一个例子是:
def foo(s):
try:
return int(s)
except ValueError:
return s
然后你通常可以使用map
:
map(foo, sys.stdin.readline().split())
以上输入行:
abcdef 110
将打印:
['abcdef', 110]
如果你总是有一个字符串和非负int:
import sys
n, m = map(lambda x: (str, int)[x.isdigit()](x) ,sys.stdin.readline().split(None, 1))
print(n,m)
但最安全的方法是在使用try / except时,即使只是期望一种类型,也可以在转换用户输入时使用。
根据要求,可以检查否定:
import sys
n, m = map(lambda x: (str, int)[x.isdigit() or x.strip("-").isdigit()](x) ,sys.stdin.readline().split())
print(n, m)
但是--10--
--10
--10--
也会通过测试,但只会因你的具体情况再次导致错误。
您可以使用str.isdigit
来测试字符串是否可以转换为整数。
>>> inpt = "foo 3"
>>> [int(s) if s.isdigit() else s for s in inpt.split()]
当然,你可以使用map
和sys.stdin.readline
使用lambda
来做同样的sys.stdin.readline
>>> map(lambda s: int(s) if s.isdigit() else s, sys.stdin.readline().split())
foo 4
['foo', 4]
如果要支持各种数据类型,可以尝试使用literal_eval
并回退到基本字符串(如果不起作用)。
import ast
def try_eval(string):
try:
return ast.literal_eval(string)
except ValueError:
return string
>>> map(try_eval, "42 3.14 foo 'bar' [1,2,3]".split())
[42, 3.1400000000000001, 'foo', 'bar', [1, 2, 3]]
map
用于何时将相同的转换应用于输入的每个元素。 这不适合您的用例; 你想以不同的方式对待这两个输入。 由于数据具有固定格式的字符串,然后是整数,因此最好以始终生成该格式的方式对其进行解析:
x, y = raw_input().split()
y = int(y)
如果您有更多列,则可以列出用于处理每列的函数:
handlers = [str, int, int, str, float, int, int]
a, b, c, d, e, f, g = [f(x) for (f, x) in zip(handlers, raw_input().split())]
其他答案建议的解决方案不考虑输入的固定格式。 如果用户输入
31 42
x
应为"31"
,而不是31
,如果用户输入
foo bar
应该被检测为错误,而不是将"bar"
分配给y
。
如果你没有寻找任何花哨的东西,你可以快速“尝试/除外”设置。
例如,
def convert(x):
try:
f = float(x)
i = int(f)
x = i if i == f else f
except:
pass
return x
arr = map(convert, sys.stdin.readline().split())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.