Şuna benzeyen bir dosya almaya çalışıyorum
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
Ve çıktının aşağıdaki gibi görünmesi için bir sözlük kullanın
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
Denediğim şey bu
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()
Sürekli TypeError: unhashable type: 'list'
hatası alıyorum. Bir sözlükteki anahtarların liste olamayacağını biliyorum ama ben değerimi anahtar değil liste yapmaya çalışıyorum. Acaba bir yerde hata mı yaptım?
Diğer yanıtlarda da belirtildiği gibi, hata k = liste[0:j]
anahtarının bir listeye dönüştürülmesinden kaynaklanmaktadır. Deneyebileceğiniz bir şey, split
işlevinden yararlanmak için kodunuzu yeniden işlemektir:
# 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 kullanıyorsanız, düzgün çalışması için küçük bir ayarlama yapmanız gerekeceğini unutmayın. Dosyayı rb
ile açarsanız, line = line.split(b'x')
kullanmanız gerekir (bu, baytı uygun karakter dizisi türüyle böldüğünüzden emin olmanızı sağlar). Ayrıca dosyayı with open('filename.txt', 'rU') as f:
(veya hatta with open('filename.txt', 'r') as f:
) kullanarak da açabilirsiniz ve sorunsuz çalışacaktır.
kyı (bir liste olan)
d` için bir anahtar olarak kullanmaya çalışıyorsunuz. Listeler değiştirilebilir ve dict anahtarları olarak kullanılamaz.
Ayrıca, bu satır nedeniyle sözlükteki listeleri asla başlatmazsınız:
if k not in d == False:
Ki öyle olmalı:
if k not in d == True:
Aslında öyle olmalı:
if k not in d:
TypeErroroluşuyor çünkü
kbir listedir, çünkü
k = list[0:j]satırıyla başka bir listeden bir dilim kullanılarak oluşturulmuştur. Bu muhtemelen
k = ' '.join(liste[0:j])` gibi bir şey olmalıdır, böylece bunun yerine bir dizeniz olur.
Buna ek olarak, if
ifadeniz Jesse'nin cevabında belirtildiği gibi yanlıştır, if k not in d
veya if not k in d
şeklinde olmalıdır (ben ikincisini tercih ediyorum).
Ayrıca for
döngüsünün içinde d = {}
olduğu için her yinelemede sözlüğünüzü temizliyorsunuz.
Ayrıca, yerleşik öğeleri maskeleyeceğiniz için değişken adı olarak list
veya file
kullanmamanız gerektiğini unutmayın.
Kodunuzu şu şekilde yeniden yazardım:
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:]))
Yukarıdaki dict.setdefault()
yöntemi, kodunuzdaki if k not in d
mantığının yerini alır.