0

我正在尝试检查 list 是否已经在 python 的字典中。我的代码应该生成 2 个随机数(r1 和 r2)并将它们附加到字典中的列表中,如果相同的 2 个数字不存在的话。这是代码:

main_dict = {0:[], 1:[], 2:[], 3:[], 4:[]}
for x in range(0,5):
    r1 = randint(1,5)
    r2 = randint(1,5)
    temp = [r1,r2]
    if temp not in main_dict:
        main_dict[x].append(r1)
        main_dict[x].append(r2)

所以基本上 main_dict 应该是这样的:{0:[2,3],1:[4,1],2:[3,3],3:[3,2],4:[5,1]} ,并且上面的代码应该注意不要重复组合。

错误是“TypeError:unhashable type: 'list'”,我想这是因为我不能在 if 旁边放一个列表,但我不知道还能放什么,我已经尝试了我的所有东西头脑。

提前致谢 :)

4

3 回答 3

4

您遇到的问题是因为如果列表存在,您正在查找字典。这样,您就可以将列表与字典的键进行比较。你想做的是:

if temp not in manin_dict.values():
于 2013-08-23T17:33:39.263 回答
2

更改if temp not in main_dict:if temp not in main_dict.values():

于 2013-08-23T17:33:30.013 回答
1

列表不能散列,因为它可以更改。您可以使用元组而不是列表和集合来有效地完成您想要的操作,以避免重复。如果您打算更改列表,可能会有一些问题需要解决。

main_dict = dict((i,[]) for i range(0,5))
main_set = set()
for x in range(0,5):
    r1 = randint(1,5)
    r2 = randint(1,5)
    temp = (r1,r2) # This is the same as tuple([r1,r2])
    if temp not in main_set:
        main_dict[x] = temp
        main_set.add(temp)

请注意,如果您只想要一组元组,您可以避免使用字典并添加到集合中。使用集合的原因是检查一个元素是否在集合中是 O(1),而检查一个元素是否在字典值列表中是 O(N)。你不会注意到只有 5 个值,但如果你有更多的值,肯定会如此。

于 2013-08-23T20:34:40.533 回答