Python - 使用map存储字符串和int(sys.stdin.readline())

时间:2015-05-22 22:05:48

标签: python python-2.7

如果输入包含空格分隔的int行,例如 -

1 3

我可以使用map()函数

将其存储在数组中
arr = map(int,sys.stdin.readline().split())

或者甚至在两个单独的变量中,通过

n,m = map(int,sys.stdin.readline().split())

有没有办法以相同的方式读取包含混合数据类型的输入行。例如.-

foo 3

其中foo是一个字符串而3是一个整数?

5 个答案:

答案 0 :(得分:4)

要做到这一点,你应该能够区分可以表示整数的字符串和不能表示整数的字符串。一个例子是:

def foo(s):
    try:
        return int(s)
    except ValueError:
        return s

然后您通常可以使用map

map(foo, sys.stdin.readline().split())

以上输入行:

abcdef 110

将打印:

['abcdef', 110]

答案 1 :(得分:4)

如果你总是有一个字符串而且非负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--也会通过测试,但只会因您的具体情况而导致错误。

答案 2 :(得分:3)

您可以使用str.isdigit来测试字符串是否可以转换为整数。

>>> inpt = "foo 3"
>>> [int(s) if s.isdigit() else s for s in inpt.split()]

当然,您可以使用map

使用sys.stdin.readlinelambda来做同样的事情
>>> 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]]

答案 3 :(得分:2)

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

答案 4 :(得分:1)

如果你没有寻找任何花哨的东西,你可以快速“尝试/除外”设置。

例如,

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())