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

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

ただいまの
回答率

90.50%

  • Python 3.x

    6419questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Network+

    45questions

    Network+とは、IT業界団体CompTIA認定のネットワーク技術に関する知識を証明する資格です。ネットワーク技術者として、実務で必要なネットワークセキュリティ・ネットワークアーキテクチャなどの知識を取得している証明となります。

TypeError: 'generator' object is not subscriptable

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 383

Hayato1201

score 92

以下の様なコードでTypeError: 'generator' object is not subscriptableというエラーが出ました。

import networkx as nx

all_shortest = nx.all_pairs_dijkstra_path(self.graph)

        for s in range(self.ACTIVE_NODES):
            for d in range(self.ACTIVE_NODES):
                if s != d:
                    next = all_shortest[s][d][1]  #ここでTypeError: 'generator' object is not subscriptable
                    port = self.ports[s][next]
                    routing_nodes[s][d] = next
                    routing_ports[s][d] = port
                else:
                    routing_nodes[s][d] = -1
                    routing_ports[s][d] = -1

ある論文に載っていたプログラムです。その為動くとは思うのですがエラーが出ているという事は何かしら環境に問題があると思います。他の部分でnetworkxのバージョンの違いによるエラーがあったので、これもnx.all_pairs_dijkstra_path(self.graph)の戻り値であるall_shortestに何か問題があるのでは無いかと思います。しかしそもそもこのエラーはどういう事なのでしょうか?

追記ーーーーーーーーーーーーーーーーーー

以下の様にしました。
すると今度は別の場所でValueError: setting an array element with a sequence.となります、、、

import networkx as nx

routing_nodes = np.full([self.ACTIVE_NODES]*2, -1.0, dtype=int)

all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))

        for s in range(self.ACTIVE_NODES):
            for d in range(self.ACTIVE_NODES):
                if s != d:
                    next = all_shortest[s][d][1]
                    port = self.ports[s][next]
                    routing_nodes[s][d] = next  #ここでValueError: setting an array element with a sequence.
                    routing_ports[s][d] = port
                else:
                    routing_nodes[s][d] = -1
                    routing_ports[s][d] = -1


今度はどういう事でしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2018/06/27 18:24

    単にall_shortest[0]と書いたときにエラーは出ますか。

    キャンセル

  • Hayato1201

    2018/06/27 18:33

    next = all_shortest[0] TypeError: 'generator' object is not subscriptableと同じエラーが出ました。。。

    キャンセル

回答 2

checkベストアンサー

0

変数保持のデフォルトの挙動が変わったので、リスト化してみてください。

a=list(range(5))
print(a[0])
a=range(5)
print(a[0]) #error

スライスをとって代入してください。

>>> import numpy as np
>>> a = np.zeros((10,10))
>>> a
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
>>> b = np.ones((2,2))
>>> b
array([[ 1.,  1.],
       [ 1.,  1.]])
>>> a[1:3, 1:3] = b
>>> a
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 18:38 編集

    最後prontになってません?
    編集するとprint(a[0])なんだが…

    キャンセル

  • 2018/06/27 18:40

    なってます。テキトーに編集するとおおかた直ります。
    それこそ 一文字入れて ⇒ それを消す みたいな編集でも大丈夫だったはず。

    キャンセル

  • 2018/06/27 18:40

    回答ありがとうございます!変数保持のデフォルトの挙動が変わったのはnetworkxの話ですよね?

    キャンセル

  • 2018/06/27 18:42

    python2→python3の話です。
    networkxが実装を変えたのかどうかはログを見ないと。

    キャンセル

  • 2018/06/27 18:43

    1空行追加しました、スッキリ。

    dbと表示がずれるの気になります。

    キャンセル

  • 2018/06/27 18:45

    たぶんpython3に移行したとき、ドキュメントのアップデート漏れ。
    Exampleが正しくない。
    https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path.html

    キャンセル

  • 2018/06/27 18:50

    了解です!ただ、all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))でリスト化するとまたその先でエラーが出てしまいました・・・その点追記しました!

    キャンセル

  • 2018/06/27 19:20

    listからさらにnp.arrayにキャストしてみてください。

    それ以前にやろうとしていることが誤っている可能性があります。

    キャンセル

  • 2018/06/27 20:56

    さらにnp.arrayにキャストという事はrouting_nodes[s][d] = np.array(next)この様にするという事ですよね?するとやはり同じ様にValueError: setting an array element with a sequence.となってしまいます。。。何度もすみませんがお分かりになりますでしょうか?

    キャンセル

  • 2018/06/27 21:07

    routing_nodes[s][d]は数、np.array(next)は配列なのでエラーになります。
    np.array(next)と同じ次元だけrouting_nodes[s][d]を取り出す必要がありますが、
    それがそもそもやりたいことなのか疑問があります。

    キャンセル

  • 2018/06/27 22:35

    結局やりたいことが不明だった為、networkxのバージョンを下げてnx.all_pairs_dijkstra_pathの戻り値を比較した所ディクショナリ型だった為、リスト型ではなくディクショナリ型でキャストしたところ、ここのエラーは無くなりました!

    キャンセル

0

値をリストからジェネレータに置き換えることで、効率化を図っているようです。
その一方で、インデックスを指定してランダムアクセスすることができなくなるのです。

単に現状のコードを動かしたいのなら、次のように修正してみてください。

all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 18:47

    回答ありがとうございます!
    all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))で行ったところすぐ後に別のエラーが出てしまいました。。。その部分を追記致しました

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6419questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Network+

    45questions

    Network+とは、IT業界団体CompTIA認定のネットワーク技術に関する知識を証明する資格です。ネットワーク技術者として、実務で必要なネットワークセキュリティ・ネットワークアーキテクチャなどの知識を取得している証明となります。