setdefault() 方法如何在此反转字典实现中工作?
How is setdefault() method working in this invert dictionary implementation?
谁能解释一下在下面的例子中字典“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: ['beautiful'], 3: ['fun'], 4: ['mine', 'ours'], 5: ['happy' , 'yours'], 6: ['sunday', '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.
让我用一个例子来说明我做的和不明白的:
- 假设 new_key = "快乐"
- new_key 的值为 5
- setdefault() 被调用,让我们假设 5 已经在“你的”字典中(据我所知,因为字典是无序的,所以不一定是这种情况,但让我们假设)并将return ["yours"] (我的猜测是这里发生了一些稍微不同的事情,所以事实上 "inverse.setdefault(5, [])" 有 returned ["yours"] 就是这样)
- append() 被调用并且 ["yours"] --> ["yours", "happy"] - 这就是我们剩下的。
我知道到 4 结束时我错了,因为实际上我们的列表已分配给键“5”。我不明白的是那件事发生的时间点 - 似乎我们只是 returned 并且真的应该分配给:
inverse[new_key] = inverse.setdefault(new_key, []).append(key)
但是,如果我 运行 这样的代码,我会得到错误 - 'NoneType' object has no attribute 'append'
。
欢迎任何解释 - 我想我一定遗漏了一些关于这两种方法如何相互作用的信息。
P.S。这是我的第一个问题,如果问题 nature/structure 不是 'how things are done around here',我深表歉意。让我知道如何改进,我会尽力做到!
打印语句是了解程序中发生的事情的一种非常有用且简单的方法:
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 中的调试器。试试看。
谁能解释一下在下面的例子中字典“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: ['beautiful'], 3: ['fun'], 4: ['mine', 'ours'], 5: ['happy' , 'yours'], 6: ['sunday', '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.
让我用一个例子来说明我做的和不明白的:
- 假设 new_key = "快乐"
- new_key 的值为 5
- setdefault() 被调用,让我们假设 5 已经在“你的”字典中(据我所知,因为字典是无序的,所以不一定是这种情况,但让我们假设)并将return ["yours"] (我的猜测是这里发生了一些稍微不同的事情,所以事实上 "inverse.setdefault(5, [])" 有 returned ["yours"] 就是这样)
- append() 被调用并且 ["yours"] --> ["yours", "happy"] - 这就是我们剩下的。
我知道到 4 结束时我错了,因为实际上我们的列表已分配给键“5”。我不明白的是那件事发生的时间点 - 似乎我们只是 returned 并且真的应该分配给:
inverse[new_key] = inverse.setdefault(new_key, []).append(key)
但是,如果我 运行 这样的代码,我会得到错误 - 'NoneType' object has no attribute 'append'
。
欢迎任何解释 - 我想我一定遗漏了一些关于这两种方法如何相互作用的信息。
P.S。这是我的第一个问题,如果问题 nature/structure 不是 'how things are done around here',我深表歉意。让我知道如何改进,我会尽力做到!
打印语句是了解程序中发生的事情的一种非常有用且简单的方法:
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 中的调试器。试试看。