setdefault()方法在这个反向字典实现中是如何工作的?

2024-06-28 06:19:28 发布

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

有人能解释一下,在下面的例子中,字典“逆”的赋值是如何发生的?

def invert_dict(d):
  inverse = {}
  for key in d:
    new_key = d[key]
    inverse.setdefault(new_key, []).append(key)
  return inverse

letters_in_word = {"mine": 4, "yours": 5, "ours": 4, "sunday": 6, "friend": 6, "fun": 3, "happy": 5, "beautiful": 8}

print (invert_dict(letters_in_word))

当然,输出是正确的:

{8:['美丽'],3:['乐趣'],4:['我的','我们的'],5:['快乐','你的'],6:['星期天','朋友']}

Python3.x文档说明:

setdefault(key[, default]):

If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

我不能用一个例子来说明:

  1. 假设new_key=“快乐”
  2. 新密钥的值为5
  3. 调用setdefault(),让我们假设5已经存在于“yours”的字典中(据我所知,因为字典是无序的,所以不一定是这样,但我们假设)并将返回[“yours”](我猜这里会发生一些稍微不同的事情,因此事实上逆.setdefault(5个,[])“已返回[“您的”],就是这样)
  4. 调用append()并[“yours”]-->;[“yours”,“happy”]—这就是我们剩下的。在

我知道在第四节末尾我错了,因为事实上我们的列表已经被分配到了键“5”。我不明白的是事情发生的时间点-我们好像刚回来,真的应该分配给:

^{pr2}$

但是,如果我像这样运行代码,就会得到错误-'NoneType' object has no attribute 'append'

任何解释都是值得赞赏的-我想我一定是遗漏了这两种方法是如何相互作用的。

附言:这是我的第一个问题,所以如果问题的性质/结构不是“这里的事情是怎么做的”的,我深表歉意。让我知道如何改进,我会尽力做到的!


Tags: keyindefaultnewreturn字典事情dict
1条回答
网友
1楼 · 发布于 2024-06-28 06:19:28

打印语句是了解程序中发生的事情的一种非常有用且简单的方法:

def invert_dict(d):
    inverse = {}
    for key in d:
        new_key = d[key]
        print('key:', key)
        print('new_key:', new_key)
        print('inverse before:', inverse)
        value = inverse.setdefault(new_key, [])
        print('inverse in the middle:', inverse)
        print('value before:', value)
        value.append(key)
        print('value after:', value)
        print('inverse after:', inverse)
    return inverse

letters_in_word = {"mine": 4, "yours": 5, "ours": 4, "sunday": 6, "friend": 6, "fun": 3, "happy": 5, "beautiful": 8}

print(invert_dict(letters_in_word))

输出:

^{pr2}$

还有一个非常有用的调试器,比如PyCharm中的调试器。试试看。在

相关问题 更多 >