gpt4 book ai didi

python - setdefault() 方法在此反向字典实现中如何工作?

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:35 26 4
gpt4 key购买 nike

有人可以解释一下在下面的情况下如何对字典“inverse”进行赋值吗?

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: ['星期日' , ' friend ']}

Python 3.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 = "happy"
  2. new_key 的值为 5
  3. setdefault() 被调用,让我们假设 5 已经在“你的”字典中(据我所知,因为字典是无序的,这不一定是这种情况,但让我们假设)并将返回 [ "yours"] (我的猜测是这里发生的情况略有不同,因此实际上“inverse.setdefault(5, [])”返回了 ["yours"] 是不正确的,就是这样)
  4. append() 被调用,并且 ["yours"] --> ["yours", "happy"] - 这就是我们剩下的。

我知道到 4 结束时我错了,因为实际上我们的列表已分配给键“5”。我不明白的是发生这种情况的时间点 - 看起来我们刚刚返回并且确实应该分配:

inverse[new_key] = inverse.setdefault(new_key, []).append(key)

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

任何解释都是值得赞赏的 - 我想我一定错过了关于这两种方法如何交互的一些东西。

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

最佳答案

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

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))

输出:

key: beautiful
new_key: 8
inverse before: {}
inverse in the middle: {8: []}
value before: []
value after: ['beautiful']
inverse after: {8: ['beautiful']}
key: yours
new_key: 5
inverse before: {8: ['beautiful']}
inverse in the middle: {8: ['beautiful'], 5: []}
value before: []
value after: ['yours']
inverse after: {8: ['beautiful'], 5: ['yours']}
key: ours
new_key: 4
inverse before: {8: ['beautiful'], 5: ['yours']}
inverse in the middle: {8: ['beautiful'], 4: [], 5: ['yours']}
value before: []
value after: ['ours']
inverse after: {8: ['beautiful'], 4: ['ours'], 5: ['yours']}
key: sunday
new_key: 6
inverse before: {8: ['beautiful'], 4: ['ours'], 5: ['yours']}
inverse in the middle: {8: ['beautiful'], 4: ['ours'], 5: ['yours'], 6: []}
value before: []
value after: ['sunday']
inverse after: {8: ['beautiful'], 4: ['ours'], 5: ['yours'], 6: ['sunday']}
key: happy
new_key: 5
inverse before: {8: ['beautiful'], 4: ['ours'], 5: ['yours'], 6: ['sunday']}
inverse in the middle: {8: ['beautiful'], 4: ['ours'], 5: ['yours'], 6: ['sunday']}
value before: ['yours']
value after: ['yours', 'happy']
inverse after: {8: ['beautiful'], 4: ['ours'], 5: ['yours', 'happy'], 6: ['sunday']}
key: fun
new_key: 3
inverse before: {8: ['beautiful'], 4: ['ours'], 5: ['yours', 'happy'], 6: ['sunday']}
inverse in the middle: {8: ['beautiful'], 3: [], 4: ['ours'], 5: ['yours', 'happy'], 6: ['sunday']}
value before: []
value after: ['fun']
inverse after: {8: ['beautiful'], 3: ['fun'], 4: ['ours'], 5: ['yours', 'happy'], 6: ['sunday']}
key: mine
new_key: 4
inverse before: {8: ['beautiful'], 3: ['fun'], 4: ['ours'], 5: ['yours', 'happy'], 6: ['sunday']}
inverse in the middle: {8: ['beautiful'], 3: ['fun'], 4: ['ours'], 5: ['yours', 'happy'], 6: ['sunday']}
value before: ['ours']
value after: ['ours', 'mine']
inverse after: {8: ['beautiful'], 3: ['fun'], 4: ['ours', 'mine'], 5: ['yours', 'happy'], 6: ['sunday']}
key: friend
new_key: 6
inverse before: {8: ['beautiful'], 3: ['fun'], 4: ['ours', 'mine'], 5: ['yours', 'happy'], 6: ['sunday']}
inverse in the middle: {8: ['beautiful'], 3: ['fun'], 4: ['ours', 'mine'], 5: ['yours', 'happy'], 6: ['sunday']}
value before: ['sunday']
value after: ['sunday', 'friend']
inverse after: {8: ['beautiful'], 3: ['fun'], 4: ['ours', 'mine'], 5: ['yours', 'happy'], 6: ['sunday', 'friend']}
{8: ['beautiful'], 3: ['fun'], 4: ['ours', 'mine'], 5: ['yours', 'happy'], 6: ['sunday', 'friend']}

一个很好的调试器也非常有用,比如 PyCharm 中的调试器。尝试一下。

关于python - setdefault() 方法在此反向字典实现中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41336865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com