85

プログラムで次のエラーが表示されます: トレースバック:

Traceback (most recent call last):
File "C:\Python33\Archive\PythonGrafos\Alpha.py", line 126, in <module>
menugrafos()
File "C:\Python33\Archive\PythonGrafos\Alpha.py", line 97, in menugrafos
zetta = Beta.caminhografo(grafo,va,vb)
File "C:\Python33\Archive\PythonGrafos\Beta.py", line 129, in caminhografo
if ([vo, a]) in vat == ([vo,vq]) in vat:
TypeError: unhashable type: 'list'

このプログラムは、正常に機能する隣接リストを実行し、頂点 va と vb の間にパスがあるかどうかを検索することを目的としています。collection/defaultdict でリストの辞書を使用して、隣接する頂点を適切に追加できるようにしました。

問題は、プログラムの最後にリストが作成された後の if 句にあります。頂点間に有効なパスがあるかどうかを調べるために、dict で if 句を適切に使用する方法が見つかりません。また、grafo はグラフ クラスです。

コードは次のとおりです。

class graph:
    v = 0
    a = 0
    node = []

class vertex:
    ta = []
    adj = {}

def caminhografo(grafo, va, vb):
    vat = defaultdict(list)
    i = 0
    a = 0
    z = 0
    vo = int(va)
    vq = int(vb)
    vz = int(va)
    vw = int(vb)
    x = len(grafo.node)
    if vz < vw:
        for vz in range (vw+1):
            a = 0
            x = len(grafo.node)
            for a in range (x):
                if [int(vz),int(a)] in grafo.node:
                    vat[vz].append(a)                   
    if vz > vw:
        while vz > vw:
            a = 0
            x = len(grafo.node)
            for a in range (x):
                if[int(va),int(a)] in grafo.node:
                    vat[vz].append(a)
            vz = vz - 1
    a = 0
    x = len(grafo.node)
    print(vat)
    for a in range (x):
       if ([vo, a]) in vat == ([vo,vq]) in vat:
           print("""
    ==============================================
               Existe Caminho
    ==============================================
    """)
           break
       elif ([vo,a]) in vat:
           vo = a
       else:           
           print("""
    ==============================================
             Não Existe Caminho
    ==============================================
        """)
           break

ご協力ありがとうございます。

4

1 に答える 1

153

問題は、キーは不変である必要があるためlist、 a のキーとしてa を使用できないことです。代わりにタプルを使用してください。dictdict

これはリストです:

[x, y]

これはタプルです:

(x, y)

ほとんどの場合、(とはタプルを実際に定義するものであるため ( orで囲まれていないか、関数の引数として使用されていない限り))オプションであることに注意してください。,[]{}

Python チュートリアルのタプルに関するセクションが役立つ場合があります。

タプルはリストに似ているように見えるかもしれませんが、さまざまな状況でさまざまな目的で使用されることがよくあります。タプルはimmutableであり、通常、アンパック (このセクションの後半を参照) またはインデックス付け (名前付きタプルの場合は属性によってさえも) を介してアクセスされる要素の異種シーケンスを含みます。リストは変更可能であり、その要素は通常同種であり、リストを反復することによってアクセスされます。

そして辞書のセクションで:

数値の範囲でインデックスが作成されるシーケンスとは異なり、辞書はキーでインデックスが作成されます。文字列と数字は常にキーになることができます。タプルに文字列、数値、またはタプルのみが含まれている場合は、タプルをキーとして使用できます。タプルに可変オブジェクトが直接的または間接的に含まれている場合、それをキーとして使用することはできません。リストは、インデックスの割り当て、スライスの割り当て、または append() や extend() などのメソッドを使用してその場で変更できるため、キーとしてリストを使用することはできません。


エラーメッセージが何を意味するのか疑問に思っている場合は、(設計上) リストの組み込みハッシュ関数がなく、辞書がハッシュテーブルとして実装されているため、不平を言っています。

于 2013-10-15T00:33:22.233 に答える