# 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,我会找回Veggie Rice Balls。
当前收到错误:TypeError:无法散列的类型:'set'
如果我输入的错误和ELI5错误,请纠正我,但这是否意味着我需要先将match转换为可哈希的内容:
allRecNames[match]
之前有人建议在我的代码中进行元组转换,并认为我也可以在此处执行类似的操作,但不会出错。
一如既往,如果这是一个愚蠢的帮助,我们将不胜感激。
答案 0 :(得分:3)
回答标题中的问题:在将其用作字典键之前,请尝试以下操作:
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]
答案 1 :(得分:0)
字典中的键是元组,因此您需要使用元组来访问它。幸运的是,iP
是一个元组,并且您已经知道它是字典中的键,因为这是您的if
语句所测试的。
因此,您只需要将allRecNames[match]
更改为allRecNames[iP]
。
也就是说,这条线本身什么也不做;它只是从字典中获取一个值,但不将该值用于任何东西。您可能要打印它,因此在这种情况下,它应该是print(allRecNames[iP])
。