1. ホーム
  2. python

[解決済み] TypeError: ハッシュ化できない型: 'リスト' を克服する方法

2022-05-11 14:55:02

質問

このようなファイルを取りたいのですが。

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' . 辞書のキーがリストにならないことは知っているのですが、キーではなく値をリストにしようとしているのです。どこかで間違えたのかと思っています。

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

他の回答にもあるように、このエラーは k = list[0:j] で、キーがリストに変換されています。1つの方法として、コードを書き換えて split 関数を利用するようにコードを作り直すことです。

# Using with ensures that the file is properly closed when you're done
with open('filename.txt', 'rb') as f:
  d = {}
  # Here we use readlines() to split the file into a list where each element is a line
  for line in f.readlines():
    # Now we split the file on `x`, since the part before the x will be
    # the key and the part after the value
    line = line.split('x')
    # Take the line parts and strip out the spaces, assigning them to the variables
    # Once you get a bit more comfortable, this works as well:
    # key, value = [x.strip() for x in line] 
    key = line[0].strip()
    value = line[1].strip()
    # Now we check if the dictionary contains the key; if so, append the new value,
    # and if not, make a new list that contains the current value
    # (For future reference, this is a great place for a defaultdict :)
    if key in d:
      d[key].append(value)
    else:
      d[key] = [value]

print d
# {'AAA': ['111', '112'], 'AAC': ['123'], 'AAB': ['111']}

Python 3.xを使用している場合、正しく動作させるためにちょっとした調整が必要なことに注意してください。もし、ファイルを rb で開く場合は line = line.split(b'x') (を使用する必要があります(これは、適切なタイプの文字列でバイトを分割していることを確認するものです)。また、ファイルを開くには with open('filename.txt', 'rU') as f: (を使うこともできます(あるいは with open('filename.txt', 'r') as f: でもよい)、うまくいくはずです。