gpt4 book ai didi

python dict setdefault,困惑

转载 作者:太空狗 更新时间:2023-10-29 21:24:39 29 4
gpt4 key购买 nike

我一直在寻找一种算法,但我无法弄清楚为什么字典 d 中有值而 curr 中没有。我认为似乎没有对 dict d 做任何事情。

>>> def what(*words):
... d = {}
... print d
... for word in words:
... print 'word: ' + word
... curr = d
... for letter in word:
... curr = curr.setdefault(letter, {})
... curr = curr.setdefault('.', '.')
... print d
... print '?'
... print curr
... return 1
...
>>> what('foo')
{}
word: foo
{'f': {'o': {'o': {'.': '.'}}}}
?
.
1

最佳答案

阅读 dict.setdefault 的文档: 就像 get 但如果 key 不存在,那么它也会被设置:

>>> my_dict = {}
>>> my_dict.setdefault('some key', 'a value')
'a value'
>>> my_dict
{'some key': 'a value'}
>>> my_dict.get('some key2', 'a value2')
'a value2'
>>> my_dict
{'some key': 'a value'}

稍微修改一下你的例子:

>>> def what(*words):
... d = dict()
... for word in words:
... curr = d
... for letter in word:
... curr = curr.setdefault(letter, {})
... curr = curr.setdefault('.', '.')
... print 'curr is now: %r while d is %r' % (curr, d)
...
>>> what('foo')
curr is now: '.' while d is {'f': {'o': {'o': {'.': '.'}}}}

如您所见,curr 发生了变化,因为在调用 setdefault 时,它有时(在您的示例中总是)创建一个新的 dict 并设置它作为 curr 的值,而 d 始终引用原始 dict。如您所见,它在循环后修改,因为它的值为{'f': {'o': {'o': {'.': '.'}} }}{} 完全不同。

您的困惑可能是因为 curr = curr.setdefault(letter, {}) 总是 创建一个新的 和 < strong>empty dict,然后分配给 curr(因此对于每个字母,您都将嵌套级别添加到原始 dict 而不是覆盖值)。

看这个:

>>> my_dict = {}
>>> curr = my_dict
>>> for letter in 'foo':
... print 'my_dict is now %r. curr is now %r' % (my_dict, curr)
... curr = curr.setdefault(letter, {})
...
my_dict is now {}. curr is now {}
my_dict is now {'f': {}}. curr is now {}
my_dict is now {'f': {'o': {}}}. curr is now {}
>>> my_dict
{'f': {'o': {'o': {}}}}

如您所见,对于每个级别,my_dict 都有一个新的嵌套级别。

也许,但我只是猜测,您想获得类似 'foo' -> {'f': {}, 'o': {}} 的东西,在这种情况下您应该做的:

>>> my_dict = {}
>>> for letter in 'foo':
... my_dict.setdefault(letter, {})
...
>>> my_dict
{'o': {}, 'f': {}}

关于python dict setdefault,困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555673/

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