2016-03-25 3 views
0

Я сделал этот код, я считаю, что проблема в строке 30 (32), я получаю следующую ошибку о словаре «RuntimeError: измененный размер слова во время итерации» Я в недоумении, поиск в google и просмотр переполнения стека имели некоторые примеры и подобные проблемы, но я не могу понять, спасибо за вашу помощь.Python runtime error dictionary

import sys 
from collections import defaultdict 
from bisect import insort 

graph = defaultdict(list) 
edges = [] 
with open("blu.txt") as f: 
    for line in f: 
     (key, val) = line.split() 
     graph[key].append(val) 
     graph[val].append(key) 
     edges.append((key, val)) 

k = 3 
change = True 
while change: 
    change = False 
    for edge in edges: 
     inter = set(graph[edge[0]]).intersection(graph[edge[1]]) 
     if len(inter) < (k - 2): 
      if edge[1] in graph[edge[0]]: 
       graph[edge[0]].remove(edge[1]) 
       change = True 
      if edge[0] in graph[edge[1]]: 
       graph[edge[1]].remove(edge[0]) 
       change = True 

g = dict((key, value) for key, value in graph.items() if value) 
for key, v in g.items(): 
    for k, value in g.items(): 
     if key in value: 
      g.pop(key, None) 

for key, value in g.items(): 
    a = [] 
    insort(a, key) 
    for v in value: 
     insort(a, v) 
    print (tuple(a)) 


# for x in graph: 
# print (x, graph[x]) 


# def generate_edges(graph): 
#  edges = [] 
#  for k in graph: 
#   for neighbour in graph[k]: 
#    edges.append((k, neighbour)) 
#  return edges 


# print(generate_edges(graph)) 

ответ

0

Вы не можете перебрать и мутировать словаря в то же время, смотрите ниже:

for key, v in g.items(): 
    for k, value in g.items(): 
     if key in value: 
      g.pop(key, None) # You can't do this in a loop. What are you trying to accomplish in the end? 

Прежде всего, вы зацикливание в два раза, без особой причины. И затем вы выскакиваете, итерации более g. Можете ли вы дать нам пример ввода и вывода с более подробной информацией?

0

эта линия - g.pop (ключ, None) Вы редактируете словаря в цикле, который запрещен вместо этого использовать что-то вроде ключей = g.keys() значений = g.values ​​() затем перебирать их вместо