类型错误:无法散列的类型:'列表',将列表转换成字典

时间:2020-07-06 16:19:11

标签: python python-3.x dictionary

     d = {}
    x = []
    l=[1,1,1,2,3,3,5,5]
    def count(lst,r):
        z = 0
        for i in lst:
            if i==r:
                z+=1
        return z
    print(count(l,1))

    def conv_to_dict(lst):
        d={}
        d={x:count(lst,i) for i in set(lst)}

    print(conv_to_dict(l))  

错误如下: 我想将列表转换成字典,其中值是其键出现在列表中的次数

    <ipython-input-32-a4e2a975b11c> in <dictcomp>(.0)
         13     d={}
         14     print(count(lst,lst[4]))
    ---> 15     d={x:count(lst,i) for i in set(lst)}
         16 
         17 print(conv_to_dict(l))

    TypeError: unhashable type: 'list'

2 个答案:

答案 0 :(得分:1)

由于使用x(在调用者的作用域中定义为空列表)作为键,因此出现此错误。列表不能用作字典键,因为列表是可变的,并且键必须是不可变的。但是,除此之外,您不希望列表成为键(当然不是x只是一个空列表),而是您要计算的特定项目,即i

一个更简单的解决方案是使用Counter类:

>>> from collections import Counter
>>> Counter(l)
Counter({1: 3, 3: 2, 5: 2, 2: 1})

答案 1 :(得分:0)

变量x属于列表类型,不能用作字典键。您可能以i变量为键:

l=[1,1,1,2,3,3,5,5]

def count(lst,r):
    z = 0
    for i in lst:
        if i==r:
            z+=1
    return z

def conv_to_dict(lst):
    d={i:count(lst,i) for i in set(lst)}
    return d

print(conv_to_dict(l))

打印:

{1: 3, 2: 1, 3: 2, 5: 2}

注意:如{Samwise的回答所述,有collections.Counter