-1

次のコードを使用して、リストをセットに変換しようとしていました。

set1=set(list1)

コードは正常に実行されていましたが、突然次のエラーが発生し始めました。

set1=set(list1)
TypeError: unhashable type: 'list'

どうすれば解決できるか教えてください。

また、一部の正常に実行されているプログラムで、パラメーターが変更されていない状態で突然エラーが発生することがあります。どのようにデバッグすればよいですか?

4

2 に答える 2

4

あなたのリストには別のリストが含まれています:

>>> set([['contained list'], 1, 2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

セットには、ハッシュ可能なアイテムのみを含めることができます。変更できない標準型はハッシュ可能ですが、 alistはそうではありません (変更可能)。対照的に、 atupleは可変ではなく、 a に格納できますset

しばらく正常に動作していたコードでも、バグは発生します。pdbのようなデバッガーを使用して、print ステートメントでデバッグするか、さらに良い方法でデバッグします。

バグが断続的にしか表示されない場合は、try/exceptブロックを使用してエラーをキャッチし、情報を出力するか、デバッガーを使用して何が起こっているかを把握します。

try:
    set1=set(list1)
except TypeError:
    print 'list1 not hashable? contents: %r' % list1
    # optionally: import pdb; pdb.set_trace()
    raise
于 2012-07-29T09:28:19.580 に答える
4

エラーは、リストにリストが含まれていることを示しています。リストは変更可能であるため、セットまたは辞書で使用するためにハッシュすることはできません。回避策の 1 つは、 を使用してリストをタプルに変換するtuple(some_list)ことですが、入れ子が多い場合は、より複雑になります。

于 2012-07-29T09:28:29.813 に答える