如何克服 TypeError: unhashable type: 'list' [英] How to overcome TypeError: unhashable type: 'list'
问题描述
我正在尝试获取一个看起来像这样的文件:
I'm trying to take a file that looks like this:
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
并使用字典使输出看起来像这样
And use a dictionary to so that the output looks like this
{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'
.我知道字典中的键不能是列表,但我试图将我的值变成列表而不是键.我想知道我是否在某个地方犯了错误.
I keep getting a TypeError: unhashable type: 'list'
. I know that keys in a dictionary can't be lists but I'm trying to make my value into a list not the key. I'm wondering if I made a mistake somewhere.
推荐答案
如其他答案所示,错误是由于 k = list[0:j]
导致的,其中您的密钥是转换为列表.您可以尝试的一件事是重新编写代码以利用 split
功能:
As indicated by the other answers, the error is to due to k = list[0:j]
, where your key is converted to a list. One thing you could try is reworking your code to take advantage of the split
function:
# 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') asf:
),它应该可以正常工作.
Note that if you are using Python 3.x, you'll have to make a minor adjustment to get it work properly. If you open the file with rb
, you'll need to use line = line.split(b'x')
(which makes sure you are splitting the byte with the proper type of string). You can also open the file using with open('filename.txt', 'rU') as f:
(or even with open('filename.txt', 'r') as f:
) and it should work fine.
这篇关于如何克服 TypeError: unhashable type: 'list'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!