2012-11-10 7 views
3

Je reçois cette erreur étrange d'essayer d'exécuter un script, le code semble être correct, mais il semble python (3) n'a pas aimé cette partie:Python - type non supporté (s): gamme et la gamme

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

et je reçois l'erreur suivante:

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

je l'ai déjà essayé de mettre les quatre dernières lignes en un seul, mais retourne python la même erreur.

+0

Quelle est l'intention de '' range (-30, 0) + range (1, 30) ''? Pourquoi pas '' range (-30, 30) ''? –

+0

@Lattyware: La plage ne doit pas inclure 0, apparemment. –

+0

Comment je n'ai pas vu ça? Ne tenez pas compte de cela alors. –

Répondre

10

C'est parce que Python 3 range ne retourne pas list, comme Python 2. Ce code a été écrit pour Python 2.

Ce code devrait être changé:

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

Il devrait être modifié à:

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

au milieu de votre expression que vous faites range(-30,0) + range(1,30). Cela provoque l'erreur car dans Python 3 range() renvoie un itérateur, pas une liste comme dans Python 2.x.

Une façon d'obtenir ce travail est de simplement convertir chaque plage une liste avant d'ajouter:

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

Comme il semble que vous voulez simplement exclure 0 du range(-30, 30), vous pouvez également utiliser filter(None, range(-30, 30)). Vous pouvez également utiliser choice((1, -1)) * choice(range(1, 30)), ce qui équivaut à choice(list(range(-30, 0)) + list(range(1, 30))). (edit: en réalité l'expression précédente n'inclura pas -30 dans les possibilités, je ne sais pas si c'est un problème).

0

Comme d'autres réponses ont dit, range() étant un itérateur est votre problème, cependant, un simple (à mon avis) la solution est de générer la liste de -30 à 30 puis retirer 0, plutôt que de l'éviter:

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

Naturellement, si vos plages étaient plus disparates, cela pourrait devenir compliqué.

1

Comme d'autres l'ont souligné le problème est que dans Python 3, range() retourne un itérateur pas une liste comme il le fait en Python 2.

Voici une solution de contournement: Ajouter quelque chose comme la fonction suivante:

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

puis modifiez le second argument d'appel Racional() de:

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

simplement:

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

Vous aurez quelque chose qui fonctionnera dans Python 2 et 3.

Questions connexes