2016-03-25 18 views
0

私はこのコードを作成しました。問題は行30(32)にあると思います。"RuntimeError:辞書のサイズが反復中に変更されました"私は紛失しています。 Google検索とスタックオーバーフローを見ていくつかの例と同様の問題があったが、私はそれを把握するように見える、あなたの助けを感謝のようです。Pythonランタイムエラー辞書

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(キー、なし) あなたは ではなく キー=のg.keys(のようなものを使用禁止されているループのために辞書を編集している) 値= g.values() 代わりにそれらを反復する