次のようなファイルを取得しようとしています:
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
そして辞書を使うと出力は次のようになります
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
私が試してみたのはこれです
file = open("filename.txt", "r")
readline = file.readline().rstrip()
while readline!= "":
list = []
list = readline.split(" ")
j = list.index("x")
k = list[0:j]
v = list[j + 1:]
d = {}
if k not in d == False:
d[k] = []
d[k].append(v)
readline = file.readline().rstrip()
が表示され続けますTypeError: unhashable type: 'list'
。辞書内のキーはリストにできないことはわかっていますが、値をキーではなくリストにしようとしています。どこかで間違いを犯したのではないかと思っています。
ベストアンサー1
注記:この回答は、質問に明確に答えていません。他の回答が答えています。質問が具体的であるためシナリオにそして、育てられた例外は一般的ですこの答えは一般的なケースを指しています。
ハッシュ値は、辞書検索中に辞書キーをすばやく比較するために使用される単なる整数です。
内部的には、hash()
メソッドは__hash__()
、任意のオブジェクトに対してデフォルトで設定されているオブジェクトのメソッドを呼び出します。
変換中ネストされたリストをセットにする
>>> a = [1,2,3,4,[5,6,7],8,9]
>>> set(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
これはリストの中にリストがあり、ハッシュ化できないリストであるため発生します。これは次のように解決できます。内部のネストされたリストをタプルに変換する、
>>> set([1, 2, 3, 4, (5, 6, 7), 8, 9])
set([1, 2, 3, 4, 8, 9, (5, 6, 7)])
明示的にハッシュするネストされたリスト
>>> hash([1, 2, 3, [4, 5,], 6, 7])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple([1, 2, 3, [4, 5,], 6, 7]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple([1, 2, 3, tuple([4, 5,]), 6, 7]))
-7943504827826258506
このエラーを回避する解決策は、リストを再構築して、リストではなくネストされたタプルを作成することです。