【问题标题】:Unhashable type不可散列的类型
【发布时间】:2020-02-09 12:28:42
【问题描述】:
# all ingredients, represented by numbers: 0= empty selection 1=rice 2=spice 3=vegetable 
allIng = [0,1,2,3]

#Each individual recipe(r)


# Veggie Rice Balls
r1 = (0,1,3)

# Curry Rice
r2 =(0,1,2)

# Herb Sauté
r3 = (0,2,3)

# Vegetable Curry
r4 = (1,2,3)


# all recipes on one list 

allRec = [r1,r2,r3,r4]
allRecNames = {(0,1,3): 'Veggie Rice Balls', (0,1,2): 'Curry Rice', (0,2,3): 'Herb Sauté', (1,2,3): 'Vegetable Curry'}


#ingredients picked
iP = []
#ingredient count
iC = 1

#User given option to pick up to 3 ingredients
while iC <= 3:
    pitem = int (input ("Pick up to 3 items "))

    if pitem in allIng:
        iP.append(pitem)
        print(iP)
        iC += 1
    else:
        print ("Incorrect entry, please pick again")

#sort list
iP.sort()
iP = tuple(iP)

#compare iP to allRec looking for matches
if iP in allRec:

    match = set ([iP]) & set(allRec)
    print ("Match:",match)
    allRecNames[match]

大家好,

试图让我的代码打印出与它们各自匹配的菜肴的名称。例如,如果我输入 0,1,3,我会拿回素食饭团。

当前出现错误:TypeError: unhashable type: 'set'

如果我错了,请纠正我和 ELI5,但这是否意味着我需要先将匹配转换为可散列的东西:

 allRecNames[match]

之前有人在我的代码中推荐了元组转换,并认为我也可以在这里做类似的事情,但没有任何痕迹和错误。

与往常一样,如果这是一个愚蠢的帮助,我们将不胜感激。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    回答标题中的问题:在将其用作字典键之前尝试一下:

    match = frozenset(match)
    

    报告的错误意味着match 是可修改的set,因此它不能用作字典键。通过使用frozenset,我们使其不可变,因此我们可以将其用作键。

    请注意,这不是真正的问题! match 看起来并不包含您期望的值,并且可以用作 allRecNames 的键。我做了一个简单的例子,它看起来像这样:

    match
    => set([(1, 2, 3)])
    

    但是allRecNames 中的键看起来像这样:

    allRecNames.keys()
    [(0, 1, 2), (0, 2, 3), (1, 2, 3), (0, 1, 3)]
    

    你发现问题了吗?您的 match 变量包含一组元组列表,但 allRecNames 的键只是一个元组。您的代码被设计破坏了-也许您真正真正的意思是:

    if iP in allRec:
        allRecNames[iP]
    

    【讨论】:

    • @kaya3 你是对的,我澄清了我的答案。谢谢!
    • 谢谢你好心的陌生人。真的很感激崩溃!
    【解决方案2】:

    您的字典中的键是元组,因此您需要使用元组来访问它。幸运的是,iP 是一个元组,您已经知道它是字典中的一个键,因为这是您的 if 语句测试的内容。

    所以,您只需将allRecNames[match] 更改为allRecNames[iP]

    也就是说,这条线本身什么也不做;它只是从字典中获取一个值,但不将该值用于任何事情。你可能想打印它,所以在这种情况下它应该是print(allRecNames[iP])

    【讨论】:

    • 抱歉耽搁了,但非常感谢!
    猜你喜欢
    • 2015-07-05
    • 2017-07-11
    • 2016-03-16
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多