Saya mencoba mengambil file yang terlihat seperti ini:
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
Dan gunakan kamus agar keluarannya terlihat seperti ini
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
Inilah yang saya coba
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()
Saya terus mendapatkan file TypeError: unhashable type: 'list'
. Saya tahu bahwa kunci dalam kamus tidak bisa menjadi daftar tetapi saya mencoba membuat nilai saya menjadi daftar, bukan kuncinya. Saya bertanya-tanya apakah saya membuat kesalahan di suatu tempat.
sumber
Anda mencoba menggunakan
k
(yang merupakan daftar) sebagai kunci untukd
. Daftar bisa berubah dan tidak bisa digunakan sebagai kunci dikt.Selain itu, Anda tidak pernah menginisialisasi daftar di kamus, karena baris ini:
if k not in d == False:
Yang seharusnya:
if k not in d == True:
Yang seharusnya:
if k not in d:
sumber
Alasan Anda mendapatkan
unhashable type: 'list'
pengecualian adalah karenak = list[0:j]
setk
menjadi "bagian" dari daftar, yang secara logis merupakan daftar yang lain, seringkali lebih pendek. Yang Anda butuhkan hanyalah mendapatkan item pertama dalam daftar, ditulis seperti ituk = list[0]
. Hal yang samav = list[j + 1:]
seharusnya hanyav = list[2]
untuk elemen ketiga dari daftar yang dikembalikan dari panggilan kereadline.split(" ")
.Saya memperhatikan beberapa kemungkinan masalah lain dengan kode, yang akan saya sebutkan beberapa. Yang besar adalah Anda tidak ingin (re) inisialisasi
d
dengand = {}
untuk setiap baris dibaca dalam lingkaran. Yang lain adalah umumnya bukanlah ide yang baik untuk menamai variabel yang sama dengan jenis built-in mana pun karena itu akan mencegah Anda untuk dapat mengakses salah satunya jika Anda membutuhkannya - dan itu membingungkan orang lain yang terbiasa dengan nama yang menunjuk salah satu item standar ini. Oleh karena itu, Anda harus mengganti nama variabellist
variabel Anda dengan sesuatu yang berbeda untuk menghindari masalah seperti itu.Berikut adalah versi kerja Anda dengan perubahan ini di dalamnya, saya juga mengganti
if
ekspresi pernyataan yang Anda gunakan untuk memeriksa untuk melihat apakah kuncinya sudah ada di kamus dan sekarang menggunakansetdefault()
metode kamus untuk menyelesaikan hal yang sama sedikit lebih ringkas.d = {} with open("nameerror.txt", "r") as file: line = file.readline().rstrip() while line: lst = line.split() # Split into sequence like ['AAA', 'x', '111']. k, _, v = lst[:3] # Get first and third items. d.setdefault(k, []).append(v) line = file.readline().rstrip() print('d: {}'.format(d))
Keluaran:
sumber
The
TypeError
terjadi karenak
adalah daftar, karena dibuat menggunakan sepotong dari daftar lain dengan garisk = list[0:j]
. Ini mungkin harus sepertik = ' '.join(list[0:j])
, jadi Anda memiliki string sebagai gantinya.Selain itu,
if
pernyataan Anda tidak benar seperti yang dicatat oleh jawaban Jesse, yang seharusnya dibacaif k not in d
atauif not k in d
(Saya lebih suka yang terakhir).Anda juga membersihkan kamus Anda pada setiap iterasi karena Anda memiliki
d = {}
bagian dalamfor
loop Anda .Perhatikan bahwa Anda juga tidak boleh menggunakan
list
ataufile
sebagai nama variabel, karena Anda akan menutupi bawaan.Inilah cara saya menulis ulang kode Anda:
d = {} with open("filename.txt", "r") as input_file: for line in input_file: fields = line.split() j = fields.index("x") k = " ".join(fields[:j]) d.setdefault(k, []).append(" ".join(fields[j+1:]))
The
dict.setdefault()
metode di atas menggantikanif k not in d
logika dari kode Anda.sumber
not k in d
dapat membingungkan pemula karena(not k) in d
, sementarak not in d
tidak memiliki ambiguitasnot in
yang terdaftar sebagai operator .!a.contains(b)
.not in
mungkin lebih pythonic, saya hanya menemukan konsep operator dua kata lebih membingungkan daripada menggunakan invers pada ekspresi boolean.python 3.2 with open("d://test.txt") as f: k=(((i.split("\n"))[0].rstrip()).split() for i in f.readlines()) d={} for i,_,v in k: d.setdefault(i,[]).append(v)
sumber