无效的文字w / python范围提取

时间:2017-04-11 15:06:25

标签: python integer range literals

有人可以向我解释是什么让以下内容返回无效的字面值?

def solution(args):
    new_args = []
    for i in args:
        if i > (i - 1) and i > (i - 2):
            new_args.append("{}-{}".format((i - 2), i))
    return list(map(float, new_args))

确切错误是:ValueError: invalid literal for float()

示例输入:

-6,-3,-2,-1,0,1,3,4,5,7,8,9,10,11,14,15,17,18,19,20

示例输出:

-6,-3-1,3-5,7-11,14,15,17-20

你会注意到它是一个合并的列表,转换为一个字符串,其中任何连续的三个原始输入现在将在列表中的一个范围内表示。

1 个答案:

答案 0 :(得分:0)

可能有很多关于这里发生了什么的猜测以及为什么会这样,但是......让我们离开尝试可能和不可能的道路。下面的代码是问题的补丁而不改变solution()背后的逻辑,因此我认为这是一个可接受的问题答案:

def solution(args):
    new_args = []
    for i in args:
        if i > (i - 1) and i > (i - 2):
            new_args.append("{}-{}".format((i - 2), i))
    return list(map(float, map(eval, new_args)))

我还没有在文档中详细检查过这个问题,但是我想到int()/ float()函数并不是设计用于获取任何不代表的字符串。整数/浮点数。在解释内容之前,他们不应该评估表达,这听起来很合理,对吧?将eval()置于转换之前可以正确完成工作并解决问题。

对于那些仍然好奇实际导致错误的人:

print(float('-1-1'))
   ValueError: could not convert string to float: '-1-1'
print(int('-1-1'))
   ValueError: invalid literal for int() with base 10: '-1-1'

在这种情况下,我不得不承认我很惊讶地看到它发生 ......因为我的直觉低声说翻译会猜测该怎么做而且只是做字符串上的另一个操作......但它没有。

  

如果模棱两可抵制猜测的诱惑!

是我所知道的领先Python背后的想法之一。

因此int(' -1-1')在int()和float()的上下文中是不明确的。问题是两个数字之间缺少的空间吗?这是一个特殊的符号吗?是加/减?何必?只是提出错误并拒绝它。