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

时间:2016-12-26 22:23:47

标签: python methods setdefault

有人可以解释如何分配字典"反向"发生在下面的情况?

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

Python 3.x文档说:

  

setdefault(key [,default]):

     

如果键在词典中,则返回其值。如果不是,请插入值为default的值并返回default。默认默认为无。

让我用一个例子来说明我做什么和不明白的事情:

  1. 假设new_key =" happy"
  2. new_key的值为5
  3. setdefault()被调用,让我们假设5已经在"你的" (据我所知,因为字典是无序的,这不一定是这种情况,但是让我们假设)并且会返回["你的"] (我的猜测是这里发生了一些略微不同的事情,所以事实并非如此,#34; inverse.setdefault(5,[])"已经返回了["你的"],那就是它)
  4. 追加()被调用,["你的"] - > ["你的","快乐"] - 这就是我们留下的。
  5. 我知道到4月底我错了,因为实际上我们的列表已被分配给密钥" 5"。我不明白的是发生了什么 - 似乎我们刚刚回来,真的应该分配:

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

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

    任何解释都表示赞赏 - 我想我必须遗漏一些关于这两种方法如何相互作用的内容。

    P.S。这是我的第一个问题,如果问题的性质/结构不是“如何围绕这里完成事情”,那么就道歉了。让我知道如何改进,我将尽我所能!

1 个答案:

答案 0 :(得分:1)

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

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中的调试器。试试吧。

相关问题