1. ホーム
  2. python

[解決済み] Python, TypeError: ハッシュ化できない型: 'list'

2023-06-16 07:05:39

質問

プログラム中に以下のようなエラーが発生します。 トレースバックです。

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の間にパスがあるかどうかを検索するもので、問題なく動作します。コレクション/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

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

どのように解決するのですか?

問題なのは、このような場合に備えて list をキーとして dict であるため dict のキーは不変である必要があるからです。代わりにタプルを使ってください。

これはリストです。

[x, y]

これはタプルです。

(x, y)

なお、ほとんどの場合 () はオプションです。 , は実際にタプルを定義するものだからです。 [] または {} または関数の引数として使用されます)。

を見つけることができるかもしれません。 Pythonチュートリアルのタプルのセクションを参照してください。 のタプルのセクションが役に立つかもしれません。

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

そして、セクションの中で ディクショナリ :

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


このエラーメッセージが何を意味するのか不思議に思っている方のために説明しますと、ビルトインの ハッシュ関数 がなく (設計上)、辞書は ハッシュテーブル .