Python - 不支持的类型:范围和范围

时间:2012-11-10 00:46:04

标签: python range operand

我在尝试运行脚本时遇到这个奇怪的错误,代码似乎是正确的但似乎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 个答案:

答案 0 :(得分:18)

这是因为Python 3 range没有像Python 2那样返回list。这段代码是为Python 2编写的。

此代码应更改:

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

应该改为:

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

答案 1 :(得分: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的东西。

答案 2 :(得分: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,不确定这是否是一个问题。)

答案 3 :(得分:0)

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

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

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