質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2463閲覧

dictionary changed size during iterationというエラーが表示される

b027eb

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/26 09:37

g=nx.Graph()
plt.figure(figsize=(15,15))#←グラフサイズ

nodesa=df5d['xname'].unique().tolist()
nodesa.append(df5d['yname'].unique()[-1])
nodes=[i[5:] for i in nodesa]
edges=[(i[1][5:],i[2][5:],i[7]) for i in df5d.itertuples()]

g.add_nodes_from(nodes)
g.add_weighted_edges_from(edges)
for (u,v) in g.edges:
if g[u][v]['weight']>=0.0025:#←閾値設定
g.remove_edge(u,v)

と入力すると

RuntimeError Traceback (most recent call last)
<ipython-input-72-1f0ef117a3f1> in <module>
10 g.add_nodes_from(nodes)
11 g.add_weighted_edges_from(edges)
---> 12 for (u,v) in g.edges:
13 if g[u][v]['weight']>=0.0025:#←閾値設定
14 g.remove_edge(u,v)

~\Anaconda3\lib\site-packages\networkx\classes\reportviews.py in iter(self)
1026 seen = {}
1027 for n, nbrs in self._nodes_nbrs():
-> 1028 for nbr in nbrs:
1029 if nbr not in seen:
1030 yield (n, nbr)

RuntimeError: dictionary changed size during iteration

というエラーが出力されます。

edges=[(i[1][5:],i[2][5:],i[7]) for i in df5d.itertuples()]
edges

と入力すると

[('1', '2', 0.001058574453069866),
('1', '3', 0.00156128024980484),
('1', '4', 0.00194647201946472),
('1', '5', 0.002949852507374631),
('1', '6', 0.004207573632538569),
('1', '7', 0.006855718292302898),
('1', '8', 0.008526903851808291),
('1', '9', 0.003766478342749529),
('1', '10', 0.00510204081632653),]

こんな感じに出力されます。

やりたいことは2点間をすべてつないで、そこから距離が指定した数値以上の線を消すということです。
for以下に問題があると思いますが分かりません。
ご回答のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RuntimeError: dictionary changed size during iteration

エラーに書いてあるとおりです。
dictの内容を順に処理しているループの中でそのdictの内容を削除してしまっているのが問題です。

python

1for (u,v) in g.edges: 2 if g[u][v]['weight']>=0.0025:#←閾値設定 3 g.remove_edge(u,v)

実現するのであれば、ループのなかで、u, v のペアの値を保持しておいて、ループを抜けた後に対象を削除するのがいいでしょう。

投稿2021/10/26 10:10

TakaiY

総合スコア12832

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

b027eb

2021/10/28 06:20

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問