你的python爸爸程序是谁

2024-04-30 06:17:31 发布

您现在位置:Python中文网/ 问答频道 /正文


我在尝试从字典中删除元素或对时遇到了困难。当您键入子名称时,它应该同时删除父项和子项,但它始终会产生以下错误:

Traceback (most recent call last):
  File "C:\Users\jam7733\Desktop\whos ur daddy.py", line 23, in <module>
    daddy()
  File "C:\Users\jam7733\Desktop\whos ur daddy.py", line 20, in daddy
    if del_son in fathers:
TypeError: unhashable type: 'list'

下面是我的代码:

^{pr2}$

Tags: inpy名称元素键入字典lineusers
3条回答

正如@kindall和@padrainchunningham在评论中所说,del_son是一个列表:

del_son = raw_input("what father/son pair do you want to delete?(type first name of son").split(" ")

因为在这里你用空格隔开了它的名字。考虑到你的代码,我相信这是个错误,或者你在写这行代码时有些东西你不明白。在

在python中,不能使用list作为dict的键,因为dict需要它的所有键都是不可变的,以确保给定的键是唯一的。在python中,lists和dicts是可变的。这意味着当你这样做时:

^{pr2}$

i只是对以值1实例化的int对象的引用。当您将2分配给i时,值为1的前一个实例将被遗忘,并将由垃圾回收器收集。但当你这样做的时候:

l = []
l.append(1)
l.append(2)

然后从l引用了一个list对象,修改后包含两个值:1和{}。现在,假设您想用dict中的list为一个值建立索引,然后:

d = {}
l1 = [3,1]
l2 = [3,4]
d[l1] = 'foo'
d[l2] = 'bar'

天真地说,这没什么不起作用的:

{[1,4]: 'foo', [3,4]: 'bar'}

但如果你这样做了呢:

l1.remove(1)
l1.append(4)

那么dict怎么还能工作,因为dict会变成:

{[3,4]: 'foo', [3,4]: 'bar'}

希望您得到了tuple类型,它是不可变和可散列的:

d = {(3,1): 'foo', (3,4): 'bar}

所以你可能不想.split()它。您可能需要strip()它(这将删除所有前导和尾随的空白字符)。在

所以给你:

del_son = raw_input("what father/son pair do you want to delete?(type first name of son").strip()
if del_son in fathers.keys():
    del fathers[del_son]

my two cents: to make it slightly more explicit, you'd better use del_son in fathers.keys(). It's actually the same as what you wrote, simply for readability it's easier, as del_son in fathers is misleading (which one could read as: "is the coder removing a son from the list of fathers? WTH?", whereas adding the .keys() will read "Ah! The coder is removing a father from a son→father mapping! Makes sense!")

高温

对于del_son输入,您将分配raw_input("...").split(" ")的结果。返回一个列表。所以del_son变成了一个列表,不能用于字典键。在

在本例中,您需要的只是分割的第一个结果,因此raw_input("...").split(" ")[0]

del_son = raw_input("what father/son pair ...").split(" ")[0]

返回了该列表中第一个项的索引。那么del_son只是第一个元素和一个字符串。在

如果raw_input...split...[0]看起来太长了,您可以将该行保留为现在的状态,并将下一位更改为:

^{pr2}$

字典不能有list类型的键,因为这些键必须是不可变的。但是,您可以使用另一个不可变的类型(比如元组),但这只是更大问题的外围问题。问题是你在没有必要的时候把儿子的名字分开。在

del_son = raw_input("what father/son pair do you want to delete?(type first name of son").split(" ")

它总是返回一个列表。键入时:

^{pr2}$

它用一个列表的键来索引父亲的dict,这是不允许的。只需删除原始输入后的.split(" "),它就可以工作了。在

相关问题 更多 >