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

无效的文本w/python范围提取,python,integer,range,literals,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:float()的文本无

有人能给我解释一下是什么使下面的返回值无效吗

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: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

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

这可能是关于这里发生了什么以及为什么会这样的猜测,但是。。。让我们离开这条路,去尝试什么是可能的,什么不是。下面的代码是对问题的修补程序,而不改变<代码>解决方案> /代码>后面的逻辑,因此我认为问题是可接受的答案:

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()的上下文中是不明确的。问题是两个数字之间缺少空格吗?它是一种特殊的符号吗?是加减法吗?为什么要麻烦?只要提出一个错误并拒绝它

查看
new_args
的内容。它们是弦。它们是可以传递给
float
的字符串吗?看起来您希望
float
计算减法表达式,但float不能这样做。它将尝试将浮点数的字符串表示形式转换为浮点数,但它对数学一无所知。
float
不会对诸如
'1-2'
之类的数值表达式求值。它只需要浮点数的字符串
\urepr\uu
并构造相应的
float
对象。这只是一种预感,但是您是否希望
i-1
args
i
前面的值?因为
i>i-1
总是正确的,所以我不明白你为什么要检查它。给我们一个
args
的例子,以及从
int
str
的预期输出,然后返回到
int
。这似乎不是最有效的方法。当然不是最具可读性的方法。
eval
总是令人讨厌。如果你知道你想把范围限制在数字上,为什么不把它们都转换成浮点数,然后减去它们呢?@tripleee完全同意你的观点,但是……请注意,问题中的代码在每一个可能的方面都没有任何意义——也许这仅仅是个拖拉?无论如何,问题是为什么会发生这种情况,我提供的代码和注释充分回答了这个问题,而没有批评这个问题,好吗?