Python 不易损坏类型:';列表';在编字典时

Python 不易损坏类型:';列表';在编字典时,python,list,dictionary,Python,List,Dictionary,我正在尝试编写一个程序,创建一个字典,其键是数字,其值是数字出现的次数,但我得到了以下消息: i是一个不可散列的列表,字典键必须是可散列的 由于您声称要查找数字,您可能想测试i的每个元素,而不是整个列表。您使用的是变量网格,因为它是一个列表,但它是一个列表列表。您应该迭代两次(您只在列表上迭代一次) 以下代码应该可以工作: from random import randint d={} grid = [[randint(1, 5)for j in range(5)] for i in range

我正在尝试编写一个程序,创建一个字典,其键是数字,其值是数字出现的次数,但我得到了以下消息:


i
是一个不可散列的
列表,字典键必须是可散列的


由于您声称要查找数字,您可能想测试
i
的每个元素,而不是整个列表。

您使用的是变量网格,因为它是一个列表,但它是一个列表列表。您应该迭代两次(您只在列表上迭代一次)

以下代码应该可以工作:

from random import randint
d={}
grid = [[randint(1, 5)for j in range(5)] for i in range(5)]

print(grid)

for array in grid: # iterate over every list inside the list of lists
    for element in array: # iterate over every element inside a list
        if element in d: # check if element is a key in d
            d[element]=d[element]+1 
        else:
            d[element]=1
编辑:根据的建议,我将代码包括在defaultdicts中: 在defaultdicts中,您首先声明键的默认值

from random import randint
from collections import defaultdict

d = defaultdict(lambda: 0)
grid = [[randint(1, 5)for j in range(5)] for i in range(5)]

print(grid)

for array in grid:
    for element in array:
        d[element]=d[element]+1

r
未在此代码中定义。这是否回答了您的问题?您的错误再清楚不过了:当您检查
如果r在d
中时,字典中的键需要是可散列的,
i
是您在
网格的每个项中生成的5个随机数的列表。你可以通过检查链接的问题来解决这个问题。将范围(5)中j的
[randint(1,5)]
更改为元组将解决此问题,除非您打算检查列表列表,否则Vasco的答案更准确。使用
defaultdict
将使此问题更加清晰。
from random import randint
d={}
grid = [[randint(1, 5)for j in range(5)] for i in range(5)]

print(grid)

for array in grid: # iterate over every list inside the list of lists
    for element in array: # iterate over every element inside a list
        if element in d: # check if element is a key in d
            d[element]=d[element]+1 
        else:
            d[element]=1
from random import randint
from collections import defaultdict

d = defaultdict(lambda: 0)
grid = [[randint(1, 5)for j in range(5)] for i in range(5)]

print(grid)

for array in grid:
    for element in array:
        d[element]=d[element]+1