[英]Python program using `defaultdicts` doesn't work as expected
預期結果:
main_dict = {
'a':
{ 0: 'Letter a',
1: 'Letter a',
2: 'Letter a',},
'b':
{ 0: 'Letter b',
1: 'Letter b',
2: 'Letter b',},
'c':
{ 0: 'Letter c',
1: 'Letter c',
2: 'Letter c',}
}
我的程序,版本1; 預期結果就是輸出。
# my_program.py
def fill_dict(a_dict, a_key):
if not a_dict.has_key(a_key):
a_dict[a_key] = {}
for i in xrange(3):
a_dict[a_key][i] = 'Letter {}'.format(a_key)
def main():
main_dict = {}
a_list = ['a', 'b', 'c']
for item in a_list:
fill_dict(main_dict, item)
if __name__ == '__main__':
main()
使用defaultdicts
重構程序; 結果是main_dict = {}
。
# defaultdict_test.py
import collections
def fill_dict(a_dict, a_key):
a_dict = collections.defaultdict(dict)
for i in xrange(3):
a_dict[a_key][i] = 'Letter {}'.format(a_key)
def main():
main_dict = {}
a_list = ['a', 'b', 'c']
for item in a_list:
fill_dict(main_dict, item)
if __name__ == '__main__':
main()
關於我在做什么的任何指示? 謝謝。
您main_dict
fill_dict
傳遞給fill_dict
,然后將新的defaultdict分配給局部變量a_dict
。 您永遠不會將這個價值傳遞出去。
在有效的程序中,您無需重新分配本地,因此,當您在a_dict上調用方法時,您正在修改傳入的值,該值是main中的main_dict值。
重新分配和方法變異之間的區別是微妙而重要的。 本文提供了有關名稱,值及其相互作用的更多信息: 有關Python名稱和值的事實和神話 。
指標:
has_key
已在Python 3中被描述並刪除 a_dict = collections.defaultdict(dict)
從fill_dict
main_dict = {}
至main_dict = collections.defaultdict(dict)
中main
做完了!
import collections
def fill_dict(a_dict, a_key):
for i in xrange(3):
a_dict[a_key][i] = 'Letter {}'.format(a_key)
def main():
main_dict = collections.defaultdict(dict)
a_list = ['a', 'b', 'c']
for item in a_list:
fill_dict(main_dict, item)
最后的指針:了解列表,設置和命令理解。 您可以在一行中完成以下數據結構:
>>> {c:{i: 'Letter {}'.format(c) for i in range(3)} for c in 'abc'}
{'a': {0: 'Letter a', 1: 'Letter a', 2: 'Letter a'}, 'c': {0: 'Letter c', 1: 'Letter c', 2: 'Letter c'}, 'b': {0: 'Letter b', 1: 'Letter b', 2: 'Letter b'}}
如果您看一下-如果以這種方式格式化,它幾乎是您想要的結果的一個版本:
dict_you_want={
c:
{ i: 'Letter {}'.format(c)
for i in range(3) } # ,
for c in 'abc'
}
它會像我在那里一樣執行...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.