[解決済み] 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:
でもよい)、うまくいくはずです。
関連
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Python関数の高度な応用を解説
-
Python jiabaライブラリの使用方法について説明
-
Python入門 openを使ったファイルの読み書きの方法
-
Pythonショートビデオクローラーチュートリアル
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く