Python。TypeError: unhashable type: 'list'
我想取一个看起来像这样的文件
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'`。我知道字典中的键不能是列表,但我想把我的值变成一个列表而不是键。我想知道我是否在某处犯了错误。
74
3
正如其他答案所指出的,这个错误是由于
k = list[0:j]
,你的键被转换为一个列表。你可以尝试重新编写你的代码,以利用split
函数。注意,如果你使用的是Python 3.x,你必须做一个小的调整才能让它正常工作。如果你用
rb
打开文件,你需要使用line = line.split(b'x')
(这可以确保你是用适当的字符串类型来分割字节)。你也可以用with open('filename.txt', 'rU')作为f:
(甚至with open('filename.txt', 'r')作为f:
)打开文件,它应该能正常工作。你试图用
k
(是一个列表)作为d
的键。列表是可变的,不能作为dict的键。而且,由于这一行,你从未初始化 dictionary 中的 list。
这应该是。
这实际上应该是。
发生 "类型错误 "是因为 "k "是一个列表,因为它是用另一个列表的切片创建的,行文是
k = list[0:j]
。 这可能应该是k = ' '.join(list[0:j])
,所以你有一个字符串代替。除此之外,你的
if'语句不正确,正如Jesse'的答案所指出的,应该是
if k不在d中或
if not k在d中`(我喜欢后者)。由于你在 "for "循环中使用了 "d = {}",所以你也在每次迭代中清除了你的字典。
请注意,你也不应该使用
list'或
file'作为变量名,因为你要屏蔽内建程序。以下是我对你的代码的改写方式。
上面的
dict.setdefault()
方法取代了你代码中的if k不在d中
逻辑。