閱讀文檔dict.setdefault
:它像get
但如果鍵不存在,那麼它也被設置:
>>> 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
並設置我t值爲curr
,而d
總是指原來的dict
。正如你可以看到它是後循環修改,因爲它的值是{'f': {'o': {'o': {'.': '.'}}}}
這是從{}
完全不同。
也許你的困惑是由於這樣的事實:curr = curr.setdefault(letter, {})
總是創建新和空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': {}}
我得到的setdefault的一部分,我的代碼是你很大的不同。 – user584583 2013-03-21 18:51:30
@ user584583我堅信,仔細閱讀文檔應該能夠解決您的問題,無論如何我已經添加了關於您的示例的解釋。 – Bakuriu 2013-03-21 19:01:25