Solución:
Como lo indican las otras respuestas, el error se debe a k = list[0:j]
, donde su clave se convierte en una lista. Una cosa que podría intentar es reelaborar su código para aprovechar las split
función:
# 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']}
Tenga en cuenta que si está utilizando Python 3.x, tendrá que hacer un pequeño ajuste para que funcione correctamente. Si abre el archivo con rb
, necesitarás usar line = line.split(b'x')
(lo que asegura que está dividiendo el byte con el tipo de cadena adecuado). También puede abrir el archivo usando with open('filename.txt', 'rU') as f:
(o incluso with open('filename.txt', 'r') as f:
) y debería funcionar bien.
Nota:
Esta respuesta no responde explícitamente a la pregunta formulada. las otras respuestas lo hacen. Dado que la pregunta es específica a un escenario y el levantado la excepción es general, Esta respuesta apunta al caso general.
Los valores hash son solo números enteros que se utilizan para comparar claves de diccionario durante una búsqueda de diccionario rápidamente.
Internamente, hash()
llamadas a métodos __hash__()
método de un objeto que se establecen de forma predeterminada para cualquier objeto.
Mudado una lista anidada a un conjunto
>>> 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'
Esto sucede debido a la lista dentro de una lista que es una lista que no se puede usar con hash. Que se puede resolver por convertir las listas anidadas internas en una tupla,
>>> set([1, 2, 3, 4, (5, 6, 7), 8, 9])
set([1, 2, 3, 4, 8, 9, (5, 6, 7)])
Hash explícitamente una lista anidada
>>> 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
La solución para evitar este error es reestructurar la lista para tener tuplas anidadas en lugar de listas.
Estas tratando de usar k
(que es una lista) como clave para d
. Las listas son mutables y no se pueden utilizar como claves de dictado.
Además, nunca está inicializando las listas en el diccionario, debido a esta línea:
if k not in d == False:
Que debería ser:
if k not in d == True:
Que debería ser en realidad:
if k not in d: