10

我在尝试运行脚本时遇到了这个奇怪的错误,代码似乎是正确的,但似乎 python (3) 不喜欢这部分:

        def function(x):
                  if integer:
                    return int(x)
                else:
                    return x

            non_nil = randrange(21)
            d = dict([(randrange(101), Racional(coeff(randrange(-20,20)),
                                    coeff(choice(range(-30,0)+\
                                                 range(1,30)))))
                     for k in range(non_nil)])

我收到以下错误:

for k in range(non_nil)]) unsupported operand type(s) for +: 'range' and 'range'

我已经尝试将最后四行放在一个中,但 python 返回相同的错误。

4

4 回答 4

33

这是因为 Python 3range不返回 a list,这与 Python 2 不同。这段代码是为 Python 2 编写的。

应更改此代码:

range(-30,0) + range(1,30)

应改为:

[*range(-30,0), *range(1,30)]

在 Python 3.5(2015,PEP 448 - Additional Unpacking Generalizations)之前,您不能使用*内部列表,而必须以这种方式编写(或者您可能更喜欢这样):

list(range(-30,0)) + list(range(1,30))
于 2012-11-10T00:49:56.480 回答
1

正如其他人指出的那样,问题是在 Python 3 中,range()返回一个迭代器而不是像 Python 2 中那样返回一个列表。

这是一种解决方法:添加类似以下函数的内容:

def non_zero_range(lower, upper):
    ret = list(range(lower, upper))
    ret.remove(0)
    return ret

然后将第二个Racional()调用参数从:

coeff(choice(range(-30,0)+range(1,30)))

简单地说:

coeff(choice(non_zero_range(-30,30)))

您将拥有在 Python 2 和 3 中都可以使用的东西。

于 2012-11-10T03:32:36.567 回答
0

在你的表情中间你做range(-30,0) + range(1,30)。这是导致错误的原因,因为在 Python 3 中range()返回一个迭代器,而不是像 Python 2.x 中的列表。

使其工作的一种方法是在添加之前将每个范围转换为列表:

d = dict([(randrange(101), Racional(coeff(randrange(-20,20)),
                                coeff(choice(list(range(-30,0))+
                                             list(range(1,30))))))
         for k in range(non_nil)])

由于您似乎只想0从 中排除,因此range(-30, 30)您也可以使用filter(None, range(-30, 30)).

或者,您可以使用choice((1, -1)) * choice(range(1, 30)),这相当于choice(list(range(-30, 0)) + list(range(1, 30))). (编辑:实际上,先前的表达式不会在可能性中包含-30,不确定这是否是一个问题)。

于 2012-11-10T00:50:05.680 回答
0

正如其他答案所说,range()作为一个迭代器是你的问题,但是,一个更简单的(在我看来)解决方案是生成列表 from -30to30然后 remove 0,而不是避免它:

choice([i for i in range(-30, 30) if i != 0])

自然,如果您的范围更加不同,这可能会变得笨拙。

于 2012-11-10T00:55:29.920 回答