2017-06-29 2 views
1

Je reçois toujours un objet TypeError 'Range' qui ne prend pas en charge l'affectation d'éléments. J'ai essayé de changer un peu le code comme dans l'addition (...) avant la plage, ainsi que la liste (...) avant la plage. Cependant, cela n'a pas aidé et l'erreur continue. Voici le code:L'objet Python Range ne prend pas en charge l'affectation

def findAnchor(anchors, node): 
    start = node     
    while node != anchors[node]: 
     node = anchors[node]  
    anchors[start] = node   
    return node 

def unionFindConnectedComponents(graph): 
    anchors = range(len(graph))   
    for node in iter(range(len(graph))):  
     for neighbor in graph[node]: 
      if neighbor < node:   
       continue 

      a1 = findAnchor(anchors, node)  
      a2 = findAnchor(anchors, neighbor) 
      if a1 < a2:       
       anchors[a2] = a1     
      elif a2 < a1:       
       anchors[a1] = a2     

    labels = [None]*len(graph)   
    current_label = 0     
    for node in range(len(graph)): 
     a = findAnchor(anchors, node) 
     if a == node:     
      labels[a] = current_label 
      current_label += 1   
     else: 
      labels[node] = labels[a] 


    return anchors, labels 

Maintenant, le TypeError est au début à des ancres [start] = nœud. Et node est un argument donné par la seconde fonction où il est dit pour node dans iter (range (len (graph))). Je l'ai essayé avec iter et avec liste, ni travaillé. Que faire?

+0

Possible duplication de [TypeError: l'objet 'range' ne prend pas en charge l'affectation d'élément] (https: // stackoverfl ow.com/questions/20484195/typeerror-range-object-does-not-support-item-assignment) – jdhao

Répondre

3

anchors = range(len(graph)) génère un list en python 2 afin que vous puissiez l'affecter.

Mais dans python 3, le comportement a changé. range devient un objet de génération de séquence paresseux, ce qui économise la mémoire & temps CPU car il est principalement utilisé pour compter dans les boucles et son utilisation pour générer un list réel contigu est plutôt rare.

De documentation:

Rather than being a function, range is actually an immutable sequence type

Et ces objets ne prennent pas en charge l'affectation de tranche ([] opération)

Quickfix: itération de force sur l'objet range, vous obtiendrez un objet que vous pouvez utiliser le découpage affectation à:

anchors = list(range(len(graph))) 
+0

Wow incroyable, merci! J'ai continué à essayer avec le 'node', je pensais que l'erreur était là à cause de start = node. –

+0

oui, 'pour node dans iter (range (len (graph))):' 'iter' est inutile ici. –

+2

gah! Nitpick, mais ça ne devient * pas * une fonction de générateur. C'est un type de séquence immuable, à mémoire constante, qui supporte la génération paresseuse de ses valeurs. Ce n'est pas un générateur. Ce n'est même pas un itérateur. Si vous ne me croyez pas, essayez 'r = range (10); suivant (r) '. –