TypeError: unhashable type: 'dict' в коде случайного обхода Networkx, который ранее работал - PullRequest
0 голосов
/ 11 января 2019

У меня было то, что я думал, было случайным рабочим обходом графа узла / грани сети.
Недавно я решил обновить Anaconda с помощью навигатора, а затем вернулся, чтобы снова запустить мою программу, и она внезапно перестала работать. Вместо этого я теперь получаю код ошибки:

runfile('C:/Users/e17/.spyder-py3/temp.py', wdir='C:/Users/e17/.spyder-py3')
Traceback (most recent call last):

File "<ipython-input-64-51811f4d02fc>", line 1, in <module>
runfile('C:/Users/e17/.spyder-py3/temp.py', wdir='C:/Users/e17/.spyder-py3')

File "C:\Users\e17\Anaconda3\lib\site- 
packages\spyder\utils\site\sitecustomize.py", line 688, in runfile
execfile(filename, namespace)

File "C:\Users\e17\Anaconda3\lib\site- 
packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/e17/.spyder-py3/temp.py", line 19, in <module>
if rc in NodesVisited:

TypeError: unhashable type: 'dict'  

Я использовал цикл while для заполнения словаря, используя узлы, которые были посещены во время случайного обхода. Это было действительно хорошо в том, что словарь пригодился для большого количества последующего анализа. Я теперь полностью потерян в том, как это исправить. Я понял, что мне нужно предоставить ключ для словаря, но я не совсем уверен, как заполнить словарь после предоставления ключей. Во всяком случае, вот код:

import networkx as nx
import random


G_fb = nx.karate_club_graph()
counter = 0
loops = 1


mylist = [];
#run while loop for multiple attempts at random walker
while loops <= 1000:

    rc = random.choice(G_fb.nodes())
    NodesVisited = {}

    #Execute random walk
    while counter <= 11:
        if rc in NodesVisited:
                NodesVisited[rc] += 1
        else:
                NodesVisited[rc] = 1

        Neighbors = G_fb.neighbors(rc)
        rc = random.choice(Neighbors)
        counter += 1

    #Organize the node list in most visited with decreasing order
    MostVisited = sorted(NodesVisited, key = NodesVisited.get,reverse = True)

    #Separate the top 10 most visited vertex
    top_top = MostVisited[:10]

    #create a list of most visited sites for plotting for each iteration  
    mylist.append(top_top)


    loops = loops + 1
    counter = 0
print ('all done!')

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 11 января 2019

В сети x 1.11 G.nodes() - это list. В более новых версиях это NodeView объект. Это изменение является причиной ваших проблем. Случайный выбор из этого оказывается возвращением данных какого-то случайного узла, что является диктатом.

Итак

if rc in NodesVisited

проверяет, является ли rc ключом NodesVisited. Для этого ему нужно хешировать rc, но это больше не узел, это диктат, поэтому он не может.

Чтобы исправить это, измените

rc = random.choice(G_fb.nodes())

до

rc = random.choice(list(G_fb.nodes()))

Точно так же вам придется изменить

Neighbors = G_fb.neighbors(rc)

до

Neighbors = list(G_fb.neighbors(rc))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...