Где я иду не так (AttributeError) - PullRequest
       15

Где я иду не так (AttributeError)

0 голосов
/ 22 октября 2019

Где я ошибаюсь

nodes=list(G.nodes())

во всем фрагменте кода в

def distribute_points(G,points): #takes two arguments
    nodes=list(G.nodes()) # get list of nodes and stores it in nodes variable
    new_points=[] #create a new points list/array
    #giving part
    for i in range(len(nodes)):  #itterating over len of list
        new_points.append(0) #intial points

    # reciving part
    for n in nodes: #iterating over nodes list
        out=list(G.out_edges(n)) #getting list of nodes
        if len (out)==0: #if a sink
            new_points[n]=new_points[n]+points[n] #completely give the share
        else:
            share=points[n]/len(out) #share equally point in n to len of out list
            for (src,tgt) in out: #giving target nodes the points in share of outgoing list
                new_points[tgt]=new_points[tgt]+share #new points of target = target+share its reciving.if not done previous value will change and we need to retain it

    return new_points #return new points

И я назвал его здесь как:

def keep_distribting(G,points):
while (1):
    new_points=**distribute_points(G,points)** #base value
    print(new_points)
    points=new_points #new points will be old points at base for n no of itteration
    stop=input("Press 0 To Stop Or Any Key To Continue: ") #user input to stop by 0
    if stop=='0': 
        break
return new_point

из-за сообщения об ошибке, и я сопоставил его с той же программой, что и она

Моя ошибка отображается как:

Traceback (последний вызов был последним):

Файл "", строка 1, в runfile ('C: / Users / Harsh / Desktop / Joy Of Computing NPTEL / Неделя 12 (Как работает Google) / Метод распределения баллов (Page Rank) .py',wdir = 'C: / Users / Harsh / Desktop / Радость от вычислений NPTEL / 12 неделя (как работает Google)')

Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize\ spydercustomize.py ", строка 786, в исполняемом файле исполняемого файла (имя файла, пространство имен)

Файл" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py ", строка 110,в execfile exec (compile (f.read (), имя файла, 'exec'), пространство имен)

Файл "C: / Users / Harsh / Desktop / Joy Of Computing NPTEL / 12 неделя (как работает Google)/ Очки Распределитьtion Method (Page Rank) .py ", строка 87, в final_points = keep_distribting (points, G)

Файл" C: / Users / Harsh / Desktop / Joy Of Computing NPTEL / Неделя 12 (Как работает Google)) / Метод распределения точек (Page Rank) .py ", строка 52, в keep_distribting new_points = distribte_points (G, points) # базовое значение

Файл" C: / Users / Harsh / Desktop / Joy Of Computing NPTEL/ Неделя 12 (Как работает Google) / Метод распределения баллов (Page Rank) .py ", строка 30, в distribte_points node = list (G.nodes ()) # получает список узлов и сохраняет его в переменной узлов

AttributeError: объект «список» не имеет атрибута «узлы»

Фрагмент кода можно найти по адресу Page Rank

Основной код:

import networkx as nx
import matplotlib.pyplot as plt
import random

def add_edges():
    nodes=list(G.nodes())

    for s in nodes:  
        for t in nodes: 
            if s!=t:

                r=random.random()
                if r<=0.5:
                    G.add_edge(s,t)


    return G            

def assign_points(G):
    nodes=list(G.nodes())
    p=[] 
    for each in nodes:
        p.append(100)
    return p

def distribute_points(G,points): 
    nodes=list(G.nodes())  
    new_points=[]
    #giving part
    for i in range(len(nodes)): 
        new_points.append(0) 


    for n in nodes:
        out=list(G.out_edges(n)) 
        if len (out)==0: 
            new_points[n]=new_points[n]+points[n] 
        else:
            share=points[n]/len(out) 
            for (src,tgt) in out: 
                new_points[tgt]=new_points[tgt]+share
    return new_points 



def keep_distribting(G,points):
    while (1):
        new_points=distribute_points(G,points) 
        points=new_points
        stop=input("Press 0 To Stop Or Any Key To Continue: ") 
        if stop=='0': 
            break
    return new_points


def rank_by_point(final_points):
    d={}
    for i in range(len(points)):
        d[i]=points[i]
    sorted(d.items(),key=lambda  f:f[1])
    print(sorted(d.items(),key=lambda  f:f[1]))




G=nx.DiGraph()
G.add_nodes_from([i for i in range(10)])
G=add_edges()

nx.draw(G,with_labels=True)
plt.show()

points=assign_points(G)

final_points=keep_distribting(points,G)

rank_by_point(final_points)

result=nx.pagerank(G)
print(sorted(result.items(),key=lambda  f:f[1]))

1 Ответ

1 голос
/ 22 октября 2019

Проблема с этой строкой кода:

final_points=keep_distribting(points,G)

Определение keep_distribting имеет другой порядок для аргументов. Он определяется как

def distribute_points(G,points):

Так что внутри функции G - это то, что раньше было points, и наоборот.


Есть некоторые дополнительные проблемы с вашим кодомо чем вы могли бы подумать:

  • keep_distribting написано неправильно, что усложняет соблюдение кода.
  • В некоторых ваших функциях G рассматривается как глобальная переменная, а в других она передается в функцию в качестве аргумента.
...